检查管道中命令的状态

mah*_*ood -1 bash

grep如果有匹配,我想要一个字符串并剪切一个字段.问题是,无论是否匹配,命令的输出$?都是0,这很奇怪.请参阅下面的输出:

$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $R
test
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

如你所见,有一个匹配但是$?为0.现在看到这个:

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

$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

在这里,g09没有匹配但$?仍为0.为什么?

anu*_*ava 5

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

PIPESTATUS
Run Code Online (Sandbox Code Playgroud)

这为您提供了单个管道命令的状态.

所以对你来说:

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

echo ${PIPESTATUS[0]}
1
Run Code Online (Sandbox Code Playgroud)

这1意味着管道中第一个grep命令失败.

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

例:

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
Run Code Online (Sandbox Code Playgroud)

在第一个例子中grep成功运行,因此我们得到${PIPESTATUS[0]}0但1在第二个例子grep中找不到任何东西.