这个数组变量将保存最后一个运行的前台管道的退出状态码.
相当有趣的是, 这个退出状态码和最后一个命令运行的退出状态码并不一定相同.
-
bash$ echo $PIPESTATUS
-
0
-
bash$ ls -al | bogus_command
-
bash: bogus_command: command not found
-
bash$ echo $PIPESTATUS
-
141
-
bash$ ls -al | bogus_command
-
bash: bogus_command: command not found
-
bash$ echo $?
- 127
$PIPESTATUS[0]保存管道中第一个命令的退出状态码.
$PIPESTATUS[1]保存第二个命令的退出状态码, 依此类推.
$PIPESTATUS变量在一个登陆的shell中可能会包含一个不正确0值(在3.0以下版本).
-
tcsh% bash
-
bash$ who | grep nobody | sort
-
bash$ echo ${PIPESTATUS[*]}
- 0
感谢, Wayne Pollock指出这一点并提供了上边的例子.
在某些上下文中, 变量$PIPESTATUS可能不会给出期望的结果.
-
bash$ echo $BASH_VERSION
-
3.00.14(1)-release
-
bash$ $ ls | bogus_command | wc
-
bash: bogus_command: command not found
-
0 0 0
-
bash$ echo ${PIPESTATUS[@]}
- 141 127 0
因为如果把ls的结果放到管道上, 并且这个输出并没有被读取, 那么SIGPIPE将会杀掉它, 同时退出状态码变为141. 而不是我们所期望的0.
这种情况也会发生在tr命令中.
$PIPESTATUS是一个"不稳定"变量. 这个变量需要在任何命令干涉之前, 并在管道询问之后立刻被查询.
-
bash$ $ ls | bogus_command | wc
-
bash: bogus_command: command not found
-
0 0 0
-
bash$ echo ${PIPESTATUS[@]}
-
0 127 0
-
bash$ echo ${PIPESTATUS[@]}
- 0
man bash
The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled.
If pipefail is enabled, the pipelinea??s return status is the value of the last (rightmost) command to exit with a non-zero status,
or zero if all commands exit successfully.
设置一下pipefail就可以获取最后一个执行错误的错误码了
-
[root@rac0 ~]# set -o pipefail
-
[root@rac0 ~]# afeef| echo
-
-
-bash: afeef: command not found
-
[root@rac0 ~]# echo $?
- 127
-
[root@test ~]# aaaa|echo bbbb
-
bbbb
-
-bash: aaaa: command not found
-
[root@test ~]# echo $?
- 0