我正在 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