Can';t将多个shell语句重定向到命名管道
观察当我一个接一个地发出两个命令时会发生什么,而不是在一行上,用分号分隔: 制作管道并发布电影:Can';t将多个shell语句重定向到命名管道,shell,named-pipes,io-redirection,Shell,Named Pipes,Io Redirection,观察当我一个接一个地发出两个命令时会发生什么,而不是在一行上,用分号分隔: 制作管道并发布电影: $ mkfifo pipe1 $ tail -f /dev/null > pipe1 & $ cat pipe1 | omxplayer /path/to/video.mp4 $ echo -n q > pipe1; # Exits movie, but omxplayer hangs $ echo > pipe1; # Completes exit process $
$ mkfifo pipe1
$ tail -f /dev/null > pipe1 &
$ cat pipe1 | omxplayer /path/to/video.mp4
$ echo -n q > pipe1; # Exits movie, but omxplayer hangs
$ echo > pipe1; # Completes exit process
$ echo -n q > pipe1; echo > pipe1 # Does nothing
$ echo -n q > pipe1; sleep 1; echo > pipe1 # Works just like trial 1
退出试验1:
$ mkfifo pipe1
$ tail -f /dev/null > pipe1 &
$ cat pipe1 | omxplayer /path/to/video.mp4
$ echo -n q > pipe1; # Exits movie, but omxplayer hangs
$ echo > pipe1; # Completes exit process
$ echo -n q > pipe1; echo > pipe1 # Does nothing
$ echo -n q > pipe1; sleep 1; echo > pipe1 # Works just like trial 1
退出试验2:
$ mkfifo pipe1
$ tail -f /dev/null > pipe1 &
$ cat pipe1 | omxplayer /path/to/video.mp4
$ echo -n q > pipe1; # Exits movie, but omxplayer hangs
$ echo > pipe1; # Completes exit process
$ echo -n q > pipe1; echo > pipe1 # Does nothing
$ echo -n q > pipe1; sleep 1; echo > pipe1 # Works just like trial 1
退出试验3:
$ mkfifo pipe1
$ tail -f /dev/null > pipe1 &
$ cat pipe1 | omxplayer /path/to/video.mp4
$ echo -n q > pipe1; # Exits movie, but omxplayer hangs
$ echo > pipe1; # Completes exit process
$ echo -n q > pipe1; echo > pipe1 # Does nothing
$ echo -n q > pipe1; sleep 1; echo > pipe1 # Works just like trial 1
有人能解释一下为什么试用2什么都不做吗。另外,是否有更好的方法通过不需要两个
echo
语句的命名管道发出quit命令?我怀疑其中涉及缓冲。(1)和(3)都在q
和换行之间提供了一段相对较长的时间,停止电影,但在它读取整行之前不退出。在(2)中,q
和linefeed靠得太近了,以至于omxplayer
可能只是忽略了整个字符串。echo q>pipe1
(与(2)类似,但速度更快)有什么作用?我怀疑其中涉及缓冲。(1)和(3)都在q
和换行之间提供了一段相对较长的时间,停止电影,但在它读取整行之前不退出。在(2)中,q
和linefeed靠得太近了,以至于omxplayer
可能只是忽略了整个字符串。echo q>pipe1
(与(2)类似,但速度更快)做什么?如果fifo上的最后一个写入程序死亡,读卡器检查fifo,它会看到文件结束。如果在读卡器检查之前又有一个新的写入程序,则读卡器不会看到文件的结尾。我猜您的阅读器(omxplayer)会检查文件的结尾
从读取器的角度来看:它看到
“q”EOF。。。EOF
“q”
(EOF
可能不被omxplayer
看到)EOF
“q”EOF。。。EOF
发生什么完全取决于omxplayer如何处理这个问题,而不是你、操作系统或你的外壳把它弄糟的问题。如果fifo上的最后一个写入程序死了,读卡器检查fifo,它会看到文件结束。如果在读卡器检查之前又有一个新的写入程序,则读卡器不会看到文件的结尾。我猜您的阅读器(omxplayer)会检查文件的结尾 从读取器的角度来看:它看到
“q”EOF。。。EOF
“q”
(EOF
可能不被omxplayer
看到)EOF
“q”EOF。。。EOF
omxplayer
如何处理这个问题,而不是你、操作系统或你的shell把它搞砸了。omxplayer
对它的(命令)输入有点挑剔。它不喜欢命令(例如,q
)以换行符'\n'
终止。将换行符作为命令的一部分('q'\n'
)将被错误处理,从而导致未知命令(而只有'q'
作为有效命令存在)。因此,当echo
-ing命令到omxplayer
时,-n
选项是必需的
除了对omxplayer
的这种“错误处理”之外,当使用cat pipe1 | cat
代替时,可以看到相同的行为。杀死第二个cat
后,是最后一个(或后面的第一个)echo
终止第一个cat
omxplayer
对其(命令)输入有点挑剔。它不喜欢命令(例如,q
)以换行符'\n'
终止。将换行符作为命令的一部分('q'\n'
)将被错误处理,从而导致未知命令(而只有'q'
作为有效命令存在)。因此,当echo
-ing命令到omxplayer
时,-n
选项是必需的
除了对
omxplayer
的这种“错误处理”之外,当使用cat pipe1 | cat
代替时,可以看到相同的行为。在杀死第二只cat
后,是最后一只(或后面的第一只)echo
终止了第一只cat
echo q>pipe1
不起作用(因此我为什么移动到echo-n q>pipe1
…基本上我是在破解我不懂的东西)是的,我也不清楚omxplayer
使用标准输入时要防止echo
发送换行。试试cat-u pipe1 | omxplayer/path/to/video.mp4
,它将禁用缓冲,并且可能允许omxplayer
在按下q
后退出,而不需要后续的echo>pipe1
。哦,我认为原因是omxplayer只接受一次按键(即,按q
notq
和ENTER
)没有缓冲,至少在userland中没有,因为涉及到多个编写器进程。echo q>pipe1
不起作用(因此,我为什么移动到echo-nq>pipe1
…基本上我是在破解我不理解的东西)是的,我也不清楚omxplayer
在使用标准输入时要防止echo
发送换行。试试cat-u pipe1 | omxplayer/path/to/video.mp4
,它将禁用缓冲,并且可能允许omxplayer
在按q
后退出,而不需要t他跟进了echo>pipe1
。哦,我想原因是omxplayer只接受一次按键(即,您按q
而不是q
和ENTER
)没有缓冲,至少在userland中没有,因为涉及到多个编写器进程。谢谢,但我不太明白你的意思:最后一个编写器,fifo死亡,新编写器bef