读取管道后bash返回代码

时间:2014-11-28 10:09:34

标签: bash shell unix pipe exit-code

如何返回$ code作为此脚本的退出代码,而不是最后一个命令的退出代码rm" $ {fifo}"。

#!/bin/bash

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

1 个答案:

答案 0 :(得分:2)

也许这可以达到您的目的:

这个答案分为两个部分,您正在寻找:

  1. 设置$?任何所需的价值
  2. 使用${PIPESTATUS[@]}数组获取管道各个阶段的退出状态...
  3. 代码:

    #!/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
    

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

    #!/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
        }