为什么ksh93中的管道与bash中的管道行为不同?
我对ksh93代码有问题。由于它非常复杂,我开始将其简化为一个示例代码,以再现相同的问题。我的结局是:为什么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
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 $?