Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t将多个shell语句重定向到命名管道_Shell_Named Pipes_Io Redirection - Fatal编程技术网

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
    not
    q
    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