Estoy trabajando en un servidor Linux y noté que la variable de matriz PIPESTATUS siempre está vacía. Estoy en la versión bash v4.1.2(1)
$ echo $BASH_VERSION
4.1.2(1)-release
$ false | true | false
$ echo ${PIPESTATUS[@]} # returns nothing (empty)
¿Cuál podría ser la razón? Revisé foros en línea, incluido el intercambio de pilas, pero no encontré una buena respuesta.
Respuesta1
Eso puede suceder si $PIPESTATUS
se ha declarado como una variable escalar o cualquier cosa que no sea una matriz o se haya hecho de solo lectura, ya sea por usted o por el código encontrado en o a través de su ~/.bashrc
/ ~/.bash_profile
... o porque había PIPESTATUS=
en el entorno cuando bash
se inició.
Puede comprobar el tipo, los atributos y el valor de $PIPESTATUS
con typeset -p PIPESTATUS
.
Luego $PIPESTATUS
permanece escalar y no se convierte automáticamente en una matriz para almacenar los estados de salida de los componentes de la tubería:
$ 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
Excepto en este readonly
caso, esto se puede solucionar volviendo a convertir la variable en una matriz o desconfigurándola:
typeset -a PIPESTATUS # beware it can affect the scope if run from a function
unset -v PIPESTATUS