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