Я работаю на сервере 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