检查管道中命令的状态

时间:2017-01-07 13:21:01

标签: bash

我希望grep获取字符串,如果匹配则剪切字段。问题是,无论是否匹配,命令$?的输出都是0,这很奇怪。请参阅下面的输出:

$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $R
test
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $?
0

如您所见,匹配但$?为0.现在请看:

$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $R

$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $?
0

此处,g09无法匹配,但$?仍为0.为什么?

1 个答案:

答案 0 :(得分:5)

$?是整体或最终退出状态。你需要看的是一个名为:

的bash数组
PIPESTATUS

它为您提供单个管道命令的状态。

所以对你而言:

read str < <(grep g09 tor.sh | cut -d ' ' -f2`)

echo ${PIPESTATUS[0]}
1

此处1表示管道中第一个grep命令失败。

PS:请注意我们正在使用流程替换,而不是命令替换,以便能够在当前shell中正确设置PIPESTATUS

示例:

read str < <(grep 'bar' <<< 'foo bar baz' | cut -d ' ' -f2)
echo ${PIPESTATUS[0]}
0

read str < <(grep 'cat' <<< 'foo bar baz' | cut -d ' ' -f2)
echo ${PIPESTATUS[0]}
1

在第一个示例中,grep成功运行,因此当${PIPESTATUS[0]}无法找到任何内容时,我们会将1设为0,但在第二个示例中为grep