如果你能解释一下你对这个结构的目标是什么,那就更好了。也许它可以简化?
问题在于这个脚本,它echo
转到stdin
由(...)
符号启动的封装外壳。但是在 shell 内部,stdin 被重新定义为通过管道传输到python的heredoc,因此它从 stdin 读取脚本,该脚本现在来自heredoc管道。
所以你尝试这样的事情:
echo -e "Line One\nLine Two\nLine Three" | python <(cat <<HERE
import sys
print "stdout hi"
for line in sys.stdin:
print line.rstrip()
print "stdout hi"
HERE
)
输出:
stdout hi
Line One
Line Two
Line Three
stdout hi
现在脚本是从 读取的/dev/fd/<filehandle>
,所以stdin
可以被echo
' 管道使用。
解决方案#2
还有另一种解决方案。该脚本可以作为这里的文档发送到python的标准输入,但是输入管道必须重定向到另一个文件描述符。为此fdopen(3)
,必须在脚本中使用 like 函数。我对python不熟悉,所以我展示了一个perl示例:
exec 10< <(echo -e "Line One\nLine Two\nLine Three")
perl <<'XXX'
print "stdout hi\n";
open($hin, "<&=", 10) or die;
while (<$hin>) { print $_; }
print "stdout hi\n";
XXX
这里echo
重定向到文件句柄 10,它在脚本中打开。
但是echo
可以fork
使用另一个heredoc删除该部分(-1) :
exec 10<<XXX
Line One
Line Two
Line Three
XXX
多行脚本
-c
或者简单地使用以下选项输入一个多脚本:
echo -e "Line One\nLine Two\nLine Three"|python -c 'import sys
print "Stdout hi"
for line in sys.stdin:
print line.rstrip()
print "Stdout hi"'