PIPESTATUS 变量为空

Pav*_*van 3 linux shell bash pipe

我在 Linux 服务器上工作,注意到 PIPESTATUS 数组变量始终为空。我在 bash v4.1.2(1)-release

$ echo $BASH_VERSION
4.1.2(1)-release
$ false | true | false
$ echo ${PIPESTATUS[@]} # returns nothing (empty)
Run Code Online (Sandbox Code Playgroud)

可能是什么原因?我检查了包括堆栈交换在内的在线论坛,但没有找到好的答案

Sté*_*las 5

这可能发生,如果$PIPESTATUS已经被宣布为一个标量或任何不是一个数组或已取得只读,无论是由您或代码或通过你的发现~/.bashrc/ ~/.bash_profile...或者因为有PIPESTATUS=环境时bash开始。

您可以检查$PIPESTATUSwith的类型、属性和值typeset -p PIPESTATUS

然后$PIPESTATUS保持标量并且不会自动转换为数组来存储管道组件的退出状态:

$ env PIPESTATUS= bash -c 'false | true; typeset -p PIPESTATUS'
declare -x PIPESTATUS=""
$ bash -c 'PIPESTATUS=; false | true; typeset -p PIPESTATUS'
declare -- PIPESTATUS=""
$ bash -c 'typeset -A PIPESTATUS; false | true; typeset -p PIPESTATUS'
declare -A PIPESTATUS
$ bash -c 'readonly PIPESTATUS; false | true; typeset -p PIPESTATUS'
declare -r PIPESTATUS
Run Code Online (Sandbox Code Playgroud)

除了这种readonly情况,可以通过将变量转换回数组或取消设置来解决这个问题:

typeset -a PIPESTATUS # beware it can affect the scope if run from a function
Run Code Online (Sandbox Code Playgroud)
unset -v PIPESTATUS
Run Code Online (Sandbox Code Playgroud)