Переменная PIPESTATUS пуста

Переменная PIPESTATUS пуста

Я работаю на сервере Linux и заметил, что переменная массива PIPESTATUS всегда пуста. Я на bash v4.1.2(1)-release

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

В чем может быть причина? Я проверил онлайн-форумы, включая Stack Exchange, но не нашел хорошего ответа.

решение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

Связанный контент