如何将内联(heredoc may?)python脚本插入bash stdin / stdout流式传输管道

时间:2013-06-13 21:43:25

标签: python bash redirect heredoc

我最近在python中做了相当多的工作,并且希望能够使用它的功能而不是shell / bash内置/ shell脚本。

对于像这样的shell管道:

echo -e "Line One\nLine Two\nLine Three" | (cat<<-HERE | python
import sys
print 'stdout hi'
for line in sys.stdin.readlines():
  print ('stdout hi on line: %s\n' %line)
HERE
) | tee -a tee.out

所有打印的内容都是“stdout hi”

这里需要解决什么?

谢谢!

1 个答案:

答案 0 :(得分:5)

如果您解释了这个结构的目标,那会更好。也许它可以简化?

问题在于此脚本echo转到由stdin表示法启动的封装shell的(...)。但是在shell中,stdin被重新定义为管道到,所以它从stdin读取脚本,现在来自管道。

所以你尝试这样的事情:

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

还有另一种解决方案。可以将脚本发送到的stdin,因为这是文档,但是输入管道必须重定向到另一个文件描述符。为此,必须在脚本中使用fdopen(3)之类的函数。我不熟悉,因此我展示了示例:

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,文件句柄10在脚本内打开。

但可以使用其他移除echo部分(-1 fork):

exec 10<<XXX
Line One
Line Two
Line Three
XXX

MULTILINE SCIPRT

或者只需使用-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"'