Ich arbeite an einem Linux-Server und habe festgestellt, dass die Array-Variable PIPESTATUS immer leer ist. Ich verwende Bash v4.1.2(1)-Release
$ echo $BASH_VERSION
4.1.2(1)-release
$ false | true | false
$ echo ${PIPESTATUS[@]} # returns nothing (empty)
Was könnte der Grund sein? Ich habe Online-Foren einschließlich Stack Exchange durchsucht, aber keine gute Antwort gefunden
Antwort1
Dies kann passieren, wenn $PIPESTATUS
als Skalarvariable oder als etwas anderes deklariert wurde, das kein Array ist, oder wenn es schreibgeschützt gemacht wurde, entweder von Ihnen oder durch Code, der in oder über Ihr ~/.bashrc
/ ~/.bash_profile
… gefunden wurde, oder weil es PIPESTATUS=
beim Start in der Umgebung vorhanden war bash
.
Sie können den Typ, die Attribute und den Wert von $PIPESTATUS
mit überprüfen typeset -p PIPESTATUS
.
Bleibt dann $PIPESTATUS
skalar und wird nicht automatisch in ein Array konvertiert, um die Beendigungsstatus von Pipeline-Komponenten zu speichern:
$ 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
Außer in diesem readonly
Fall kann dies umgangen werden, indem die Variable wieder in ein Array umgewandelt wird oder indem sie gelöscht wird:
typeset -a PIPESTATUS # beware it can affect the scope if run from a function
unset -v PIPESTATUS