有人可以解释为什么这个短的bash / python命令不会输出“hello”
$ echo hello | python - <<END
import sys
for line in sys.stdin:
print line
END
如果我将python脚本保存到文件中,则此命令按预期工作。
在script.py
中import sys
for line in sys.stdin:
print line
END
$ echo“你好”| python script.py
“你好”
答案 0 :(得分:5)
它不起作用的原因是你有重叠的冲突。 echo | python
尝试将标准输入绑定到echo
的管道,而python - <<HERE
尝试将标准输入绑定到此文档。你不能两者兼得。 (这里的文件胜出。)
但是,没有理由想要在标准输入上管道脚本本身。
bash$ echo hello | python -c '
> import sys
> for line in sys.stdin:
> print line'
hello
答案 1 :(得分:4)
因为python << END
重定向stdin以读取程序。您也无法在stdin上读取echo
上传输的线路。
答案 2 :(得分:4)
哦,小伙子,这很有道理!过去一小时我一直在努力解决这个问题,最后我明白了,谢谢你们两位。
要为原始程序提供工作替代方案,您可以执行以下操作:
$ echo hello | python <(cat <<END
import sys
for line in sys.stdin:
print line
END
)
但要小心!如果你把它放在一个文件中,最后的END
需要触及左边的水槽(没有空格)。否则,它不会解析“寻找匹配字符时出现意外的文件结尾”错误或类似错误(实际上,这比我开始回答这个时间还需要两个小时才能弄明白)。
解释代码,发生的事情是<<END ... END
与<(cat ...)
结合创建了一个文件(在/dev/fd
中),以便将其提供给python
,好像它是一个真实的文件。引用this关于<(...)
的说明:
这是流程替代。它将命令的输出提供给a 可以像普通文件一样读取的FIFO。
关于这个主题还有另一个有趣的答案here。