GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Exit-Code der Variablenzuweisung zur Befehlsersetzung in Bash

Beachten Sie, dass dies in Kombination mit local nicht der Fall ist , wie in local variable="$(command)" . Dieses Formular wird erfolgreich beendet, selbst wenn command fehlgeschlagen.

Nehmen Sie zum Beispiel dieses Bash-Skript:

#!/bin/bash

function funWithLocalAndAssignmentTogether() {
    local output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

function funWithLocalAndAssignmentSeparate() {
    local output
    output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate

Hier ist die Ausgabe davon:

[email protected]:~$ ./tmp.sh 
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1

Das liegt daran, dass local ist eigentlich ein eingebauter Befehl und ein Befehl wie local variable="$(command)" ruft local auf nach Ersetzen der Ausgabe von command . Sie erhalten also den Exit-Status von local .


Beim Ausführen eines Befehls als $(command) erlaubt der Ausgabe des Befehls, sich selbst zu ersetzen.

Wenn Sie sagen:

a=$(false)             # false fails; the output of false is stored in the variable a

die vom Befehl false erzeugte Ausgabe wird in der Variable a gespeichert . Darüber hinaus ist der Exit-Code derselbe wie der vom Befehl erzeugte. help false würde sagen:

false: false
    Return an unsuccessful result.

    Exit Status:
    Always fails.

Auf der anderen Seite sagen:

$ false                # Exit code: 1
$ a=""                 # Exit code: 0
$ echo $?              # Prints 0

bewirkt den Exitcode für die Zuordnung zu a zurückgegeben werden soll, also 0 .

BEARBEITEN:

Zitat aus dem Handbuch:

Wenn eine der Erweiterungen eine Befehlsersetzung enthielt, ist der Ausgangsstatus des Befehls der Ausgangsstatus der letzten durchgeführten Befehlsersetzung.

Zitat aus BASHFAQ/002:

Wie kann ich den Rückgabewert und/oder die Ausgabe eines Befehls in einer Variablen speichern?

...

output=$(command)

status=$?

Die Zuordnung zu output hat keine Auswirkung auf command den Exit-Status von , der immer noch auf $? steht .


Linux
  1. Bash-Befehlszeilen-Exit-Codes entmystifiziert

  2. Bash-Scripting(I)

  3. Zitieren innerhalb von $ (command Substitution) in Bash?

  4. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

  5. Wie wertet Bash folgenden Code aus?

Bash-Exportvariable

Bash-Wartebefehl

Bash Exit-Befehl und Exit-Codes

Bash-printf-Befehl

Bash:Schleife, bis der Befehlsausgangsstatus gleich 0 ist

Was macht das -e in einem Bash-Shebang?