如何使用$ {PIPESTATUS [*]}确定一个程序输出到管道作为shell中的下一个程序输入

时间:2018-02-07 07:46:15

标签: bash shell pipe

我是shell脚本的新手。我有一个场景,我需要获取一个shell脚本的退出状态,并将其值作为输入(如果退出代码为零/否则退出主shell脚本文件)传递给下一个shell脚本并继续,直到它执行所有脚本。下面是我试过的代码。但它没有按预期工作。

status=`run1.sh`
if [[ status -eq 0 ]]; then
status=`run2.sh`
else
exit 1
fi
if [[ status -eq 0 ]];then
status=`run3.sh`
else
exit 2
fi

它成功运行前2个脚本。即使run2.sh的输出值为0,它也会在第二个if块上失败,我在google中搜索,它建议使用{PIPESTATUS [@]},我尝试用pipestatus替换exit 1并通过pipestatus在第二个if块中如下所示。

status=`run1.sh`
if [[ status -eq 0 ]]; then
status=`run2.sh`
else
exit ${PIPESTATUS[1]} ## pipestatus[1]- is run2.sh output value
fi
if [[ ${PIPESTATUS[1]} -eq 0 ]];then
status=`run3.sh`
else
exit 2
fi

我想我不清楚如何使用pipestatus。如果有人能为我的方案提供一些示例,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

status是一个静态字符串;你根本没有检查你创建的变量。

此处没有管道,因此PIPESTATUS无法发挥作用。它适用于像

这样的代码
one | two

传统上,one的退出状态不可用于shell; Bash通过公开管道中每个进程的结果来改变它。

让您的脚本打印数字零以表示成功并不是通常的方式。命令产生输出和状态代码(作为exit或函数的参数给出的数字return),代码通常会检查后者。它暴露在$?中,但是shell的控制结构隐式地检查它,所以你的代码看起来像

if run1.sh; then
    if run2.sh; then
        if run3.sh; then
            ...

如果您更改它们以生成有用的退出代码。虽然这可以进一步简化为

run1.sh || exit
run2.sh || exit
run3.sh || exit

甚至

set -e
run1.sh
run2.sh
run3.sh