我正在 Linux 服务器上工作,注意到 PIPESTATUS 数组变量始终为空。我使用的是 bash v4.1.2(1)-release
$ echo $BASH_VERSION
4.1.2(1)-release
$ false | true | false
$ echo ${PIPESTATUS[@]} # returns nothing (empty)
可能是什么原因?我检查了包括堆栈交换在内的在线论坛,但没有找到好的答案
答案1
$PIPESTATUS
如果已将其声明为标量变量或任何非数组或已设为只读的变量(由您或在 / ... 中找到的代码或通过您的~/.bashrc
/ ... 或因为在启动时~/.bash_profile
存在PIPESTATUS=
于环境中),则可能会发生这种情况。bash
您可以检查 的类型、属性和$PIPESTATUS
值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
除了这种readonly
情况,可以通过将变量转换回数组或取消设置来解决这个问题:
typeset -a PIPESTATUS # beware it can affect the scope if run from a function
unset -v PIPESTATUS