为什么ksh93中的管道与bash中的管道行为不同?

为什么ksh93中的管道与bash中的管道行为不同?,bash,ksh,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

我对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”

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

或者。。。如果我在第一个
cat
中离开,但在
期间从
中删除了第二个,则它们的工作方式相同

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
命令本身并不是罪魁祸首。

在我的机器上运行ksh93中的第一个脚本得到1(bash也是如此)。@Robin479您有什么版本的ksh93?矿山sais
版本sh(AT&T研究)93t+2010-03-05
$ksh93——版本sh(AT&T研究)93u+2012-08-01详细解释为“在大多数外壳中,管道的每个命令都在单独的子外壳中执行”。我不希望不同的shell以相同的方式处理管道序列中某个命令的返回代码。更改管道中的编号或顺序也是一样。@ULick谢谢您的评论。然而,根据Bash和Ksh文档,两者应该返回相同的输出。我的Ksh里好像有个虫子。
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 $?
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 $?