Answers:
你需要
python -i
所以:
python -i < p1
在其他地方:
exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-
exec 3>&-
和exec 3>&1
这里的一样吗?
3>&-
这里写。3>&1
也会工作,但毫无意义。谢谢
您可以用来tail -f
在echo
写入后将fifo保持打开状态。
tail -n1 -f p1 | python
为什么这样做
python
正在从阅读p1
。当到达文件末尾时,它将停止读取。即使文件是命名管道,这也是文件读取的正常行为。tail
带有-f
(follow)标志的文件将在到达文件末尾后继续读取文件。
echo "print \"Hello World\" " > p1
在第二个终端中尝试过,但没有任何反应-但终端也未受阻。带有python的终端保持阻塞,直到^c
退出并退出并终止python,并显示python的键盘中断消息。
tail -f
通过命名管道解压缩块分割的tar归档文件时,我使用了此技巧。效果很好。
您需要一次发送整个程序。
当您调用run时python < p1
,shell会在调用python之前等待输入。也就是说,蟒蛇甚至没有开始执行所有,直到整个数据流已经被shell读取,然后在其完整地传递python
。
即使运行它python -u p1
(即,未缓冲并从file读取p1
),它python
也会尝试在执行任何文件之前先读取整个文件。
试试这个实验。
1号航站楼:
mkfifo p1
python < p1
2号航站楼:
cat > p1
print "Hello World"
print "Hello World"
您会看到您可以发送多行,但是术语1中的python什么都不做。现在按ctrl+ D。整个程序立即执行。
因此,总而言之,如果您希望python从管道读取数据,则需要发送整个程序。您不能以这种方式交互使用python。
也许尾部方法更好(更灵活),但可以选择:
{ echo -n "print \"Hello World\""; cat; } > p1
-n
可能已被删除。而在这之后,0与终端echo
命令被阻塞,直到我按1 Python不执行命令^c
在echo
终端和进程都终止。
exec 3> p1
做什么,什么是&3
&exec 3> &1
?谢谢。