use*_*871 50 unix bash pipe echo
我想将一些数据输出到管道,并让另一个进程逐行对数据执行某些操作.这是一个玩具示例:
mkfifo pipe
cat pipe&
cat >pipe
Run Code Online (Sandbox Code Playgroud)
现在我可以输入我想要的任何内容,按下回车后我立即看到同一行.但如果替换第二管道echo:
mkfifo pipe
cat pipe&
echo "some data" >pipe
Run Code Online (Sandbox Code Playgroud)
管道在完成之后关闭echo,cat pipe&因此我无法通过管道传递更多数据.有没有办法避免关闭管道和接收数据的进程,以便我可以从bash脚本通过管道传递多行数据,并在它们到达时处理它们?
Mar*_*gar 52
将要输出的所有语句放在同一个子shell中的fifo中:
# Create pipe and start reader.
mkfifo pipe
cat pipe &
# Write to pipe.
(
echo one
echo two
) >pipe
Run Code Online (Sandbox Code Playgroud)
如果您有更多复杂性,可以打开管道进行编写:
# Create pipe and start reader.
mkfifo pipe
cat pipe &
# Open pipe for writing.
exec 3>pipe
echo one >&3
echo two >&3
# Close pipe.
exec 3>&-
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 47
当打开FIFO进行读取时,它会阻止调用进程(通常).当进程打开FIFO进行写入时,读取器将被解除阻塞.当写入器关闭FIFO时,读取过程获得EOF(读取0个字节),除了关闭FIFO并重新打开之外,没有什么可以做的.因此,您需要使用循环:
mkfifo pipe
(while cat pipe; do : Nothing; done &)
echo "some data" > pipe
echo "more data" > pipe
Run Code Online (Sandbox Code Playgroud)
另一种方法是在FIFO打开的情况下保留一些进程.
mkfifo pipe
sleep 10000 > pipe &
cat pipe &
echo "some data" > pipe
echo "more data" > pipe
Run Code Online (Sandbox Code Playgroud)
Pat*_*ick 21
您可以通过以读写模式打开管道的读取端来轻松解决此问题.一旦最后一位作家关闭,读者只能得到一个EOF.因此,在读写中打开它可确保始终至少有一个写入器.
所以将你的第二个例子改为:
mkfifo pipe
cat <>pipe &
echo "some data" >pipe
Run Code Online (Sandbox Code Playgroud)