读取管道后的Bash返回代码

3
如何使$code成为此脚本的退出代码而不是最后一个命令rm "${fifo}"的退出代码。
#!/bin/bash

fifo=myPipe
mkfifo "${fifo}"|| exit 1
{
    read code <${fifo}
} | {
    timeout 1 sleep 2
    timeoutCode=$?
    echo "${timeoutCode}" >${fifo}
}
rm "${fifo}"

在第一组中,我将使用tail -f命令跟踪文件,在第二组中,我将使用grep查找匹配项或超时,然后通过管道通知第一组,以终止tail进程。最后,我希望能够获得一个退出代码,显示是否已经超时或成功匹配。 - dmc
1个回答

3
也许这可以满足你的需求:
这个答案有两部分,正如你所寻找的一样: 1.将 $? 设置为任何所需的值 2.使用 ${PIPESTATUS[@]} 数组来获取管道中各个阶段的退出状态...
代码:
#!/bin/bash

return_code() { return $1; }    # A dummy function to set $? to any value

fifo=myPipe
mkfifo "${fifo}"|| exit 1
{
    read code <${fifo}
    return_code $code
} | {
    timeout 1 sleep 2
    timeoutCode=$?
    echo "${timeoutCode}" >${fifo}
}
ret=${PIPESTATUS[0]}
rm "${fifo}"
exit $ret

考虑到整个脚本的预期退出代码实际上是通过管道的第二阶段生成的,因此下面的逻辑也可以工作。

#!/bin/bash

    fifo=myPipe
    trap "rm $fifo" EXIT #Put your cleanup here...

    mkfifo "${fifo}"|| exit 1
    {
        read code <${fifo}
    } | {
        timeout 1 sleep 2
        timeoutCode=$?
        echo unused > ${fifo}
        exit $timeoutCode
    }

它可以工作,因此第0阶段的退出代码是最后一个函数“return_code”的返回代码吗? - dmc
是的,${PIPESTATUS[0]}将包含第一个阶段的退出状态,在这里恰好是$code... - anishsane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接