后台进程重定向到 COPROC

dav*_*ide 5 bash ipc pipe io-redirection coproc

在下面的测试脚本中,我运行一个基本协进程echo,在后台运行的内置协进程附加其标准输出:

#!/bin/bash
# TEST 1
coproc /bin/sleep 100
echo >&${COPROC[1]} &
Run Code Online (Sandbox Code Playgroud)

该脚本总是失败,没有明显的原因,给出输出:

./test.sh: line 4: ${COPROC[1]}: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

我想知道正确的语法是否应该是这样的(&符号在重定向之前移动):

#!/bin/bash
# TEST 2
coproc /bin/sleep 100
echo & >&${COPROC[1]}
Run Code Online (Sandbox Code Playgroud)

第二个示例似乎有效,因为它在执行过程中没有报告任何错误,但使用此语法,实际上不会执行重定向;事实上,考虑另一个测试:

#!/bin/bash
# TEST 3
/bin/echo abc & >xfile
Run Code Online (Sandbox Code Playgroud)

测试 3 创建该文件xfile,但不向其中写入任何内容。奇怪的是,在重定向后再次尝试定位&符号可以使echo工作正常:

#!/bin/bash
# TEST 4
/bin/echo abc >xfile &
Run Code Online (Sandbox Code Playgroud)

xfile测试 4 创建包含字符串 的文件abc

了解导致coproc重定向错误的原因或正确的语法是什么?

imz*_*hev 2

您在其他地方得到了答案http://lists.gnu.org/archive/html/bug-bash/2012-06/msg00027.html

Coproc 文件描述符不可用于子 shell。它们是使用管道实现的,在子 shell 中打开管道文件描述符会导致进程挂起且无法正确终止,从而导致非常难以跟踪和重现的错误。