Многие скриптовые задачи удобнее решать на Python, чем на Bash. Но если в скрипте много конвейеров, то такой скрипт удобнее писать на Bash благодаря удобному и лаконичному конвейерному синтаксису.
Этому пора положить предел. Я хочу показать пример использования библиотеки конвейеров команд на Python, которую я пишу и чуть позже выложу.
В прошлом посте я разместил вспомогательный скрипт active_uid, написанный на
Bash и определяющий имя активного пользователя в системе. Он очень простой и
делает следующее. Если имена всех вошедших пользователей совпадают, то этот
пользователь и есть активный. Иначе это UID root:
#!/bin/bash
uids () {
users | tr " " "\n" | uniq
}
if [ `uids | wc -l` == 1 ]; then
uid=`uids`
else
uid="0"
fi
echo ACTIVE_UID="$uid"
Работает примерно так:
$ ./active_uid
ACTIVE_UID=vlan
А вот тот же самый скрипт, переписанный на Python с помощью будущей библиотеки. Замечу, что он намеренно оставлен таким же по структуре, хотя было бы намного проще разбить строки на Python без вызовов внешних процессов. Итак, скрипт:
#!/usr/bin/env python
from ... import runpipe, pipe, join, o
uids = join(runpipe(r'users | tr {} \n | uniq', ' '))
if o(int, join, pipe('wc -l'))(uids) == 1:
uid = uids
else:
uid = 'root'
print 'ACTIVE_UID=%s' % uid
А это более идиоматичный код на Python (хотя по-прежнему с композицией функций), где внешний процесс используется только для получения списка текущих пользователей:
#!/usr/bin/env python
from ... import runpipe, join, o
split = lambda s: s.split()
uids = o(list, set, split, join, runpipe)('users')
uid = uids[0] if len(uids) == 1 else 'root'
print 'ACTIVE_UID=%s' % uid