为了我自己的乐趣,我编写了一个 python 脚本,它允许我将 python 用于 bash 单行;提供一个 python 生成器表达式;并且脚本对其进行迭代。这是脚本:
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)' foo Enter bar Enter bazEnter Ctrl DCtrl D 'foo\n' '谷仓' '巴兹\n' $
为了停止接受输入并产生任何输出,我必须输入Enter- Ctrl D-Ctrl D或 Ctrl D- Ctrl D- Ctrl D。这违反了我的期望,即每行都应按输入进行处理,并且Ctrl D随时键入都会结束脚本。我的理解差距在哪里?
编辑:我已经更新了交互式示例,以表明我没有看到 wim 在他的回答中描述的引用,以及更多示例。
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)' foo Ctrl DCtrl DbarEnter Ctrl DCtrl D 'foobar\n' $ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooCtrl VCtrl D ^D barEnter Ctrl DCtrl D 'foo\x04bar\n' $