与bash相比,为什么这个管道在ksh93中表现不同?

时间:2017-04-07 13:41:27

标签: bash ksh

我遇到了ksh93代码的问题。由于它非常复杂,我开始将其简化为一个可以重现相同问题的示例代码。我最终得到了这个:

set -o pipefail;

{
        echo "progress" 1>&3 | false
} 3>&1 | cat | \
        while read pv_output; do
                echo "meanwhile ... we got "
                echo $pv_output | cat
        done

echo $?

当我使用ksh93运行此代码时,它输出" 0",当我用bash运行它时,它输出" 1"。

# echo "ksh93";ksh93 ./x1.sh ;echo "bash"; bash ./x1.sh
ksh93
meanwhile ... we got
progress
0
bash
meanwhile ... we got
progress
1

但是,如果我开始摆弄代码并删除第一个cat,则两个shell都返回" 1"

set -o pipefail;

{
        echo "progress" 1>&3 | false
} 3>&1 | \
        while read pv_output; do
                echo "meanwhile ... we got "
                echo $pv_output | cat
        done

echo $?

或者......如果我离开第一个cat,但是我从while内删除了第二个,它们的工作方式会再次相同。

set -o pipefail;

{
        echo "progress" 1>&3 | false
} 3>&1 | cat | \
        while read pv_output; do
                echo "meanwhile ... we got "
                echo $pv_output
        done

echo $?

现在,为了简单起见,我使用了cat这个例子。在现实生活中,第一个cat实际上是awk处理复杂命令的输出。第二个cat实际上是sed。我提到这些,所以很明显cat命令本身并不是罪魁祸首。

0 个答案:

没有答案