从命名管道获取标准输入

Lor*_*oh. 10 shell terminal pipe io-redirection stdin

我想要做的是在终端窗口中运行 python 并从命名管道重定向它的标准输入。然后我在另一个终端写入命名管道并在 python 上执行该命令。

1号航站楼:

mkfifo p1
python < p1
Run Code Online (Sandbox Code Playgroud)

2 号航站楼:

echo -n "print \"Hello World\"" > p1
Run Code Online (Sandbox Code Playgroud)

会发生什么 - python 打印Hello World并退出。我想要做的是保持 python 运行以执行下一个命令。我如何在 shell 中执行此操作?

Sté*_*las 10

你需要

  • 以交互方式运行 python,即使它的 stdin 不是终端:使用 python -i
  • 保持管道的写入端打开,否则python会检测到EOF并退出。

所以:

python -i < p1
Run Code Online (Sandbox Code Playgroud)

和其他地方:

exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用tail -fecho写入后保持 fifo 打开。

tail -n1 -f p1 | python
Run Code Online (Sandbox Code Playgroud)

为什么这有效

python正在阅读p1。当它到达文件末尾时,它停止读取。这是文件读取的正常行为,即使文件是命名管道。tail使用-f(follow) 标志将在到达文件末尾后继续读取文件。