Для моего собственного развлечения я приготовил python script, который позволяет мне использовать python для bash однострочных; Поставить выражение генератора питона; и script выполняет итерацию по ней. Здесь script:
DEFAULT_MODULES = ['os', 're', 'sys']
_g = {}
for m in DEFAULT_MODULES:
_g[m] = __import__(m)
import sys
sys.stdout.writelines(eval(sys.argv[1], _g))
И вот как вы можете его использовать.
$ groups | python pype.py '(l.upper() for l in sys.stdin)'
DBORNSIDE
$
Для предполагаемого использования он отлично работает!
Но когда я не кормлю его трубкой и просто вызываю его непосредственно, например: [выделение добавлено, чтобы показать, что я набираю]
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooEnter barEnter bazEnter Ctrl DCtrl D'foo\n' 'bar\n' 'baz\n' $
Чтобы остановить прием ввода и произвести какой-либо вывод, я должен ввести либо Enter - Ctrl D - Ctrl D, либо Ctrl D - Ctrl D - Ctrl D. Это нарушает мои ожидания, что каждая строка должна обрабатываться как введенная, и что ввод Ctrl D в любое время закончится script. Где разрыв в моем понимании?
EDIT: я обновил интерактивный пример, чтобы показать, что я не вижу цитирования wim в его ответе и еще несколько примеров.
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooCtrl DCtrl DbarEnter Ctrl DCtrl D'foobar\n' $ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooCtrl VCtrl D^DbarEnter Ctrl DCtrl D'foo\x04bar\n' $