Nota che questo non è il caso quando combinato con local
, come in local variable="$(command)"
. Quel modulo uscirà correttamente anche se command
fallito.
Prendi questo script Bash per esempio:
#!/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
Ecco l'output di questo:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
Questo perché local
è in realtà un comando integrato e un comando come local variable="$(command)"
chiama local
dopo sostituendo l'output di command
. Quindi ottieni lo stato di uscita da local
.
Dopo aver eseguito un comando come $(command)
consente all'output del comando di sostituirsi.
Quando dici:
a=$(false) # false fails; the output of false is stored in the variable a
l'output prodotto dal comando false
è memorizzato nella variabile a
. Inoltre, il codice di uscita è lo stesso prodotto dal comando. help false
direbbe:
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
D'altra parte, dicendo:
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
provoca il codice di uscita per l'assegnazione a a
da restituire che è 0
.
MODIFICA:
Citando dal manuale:
Se una delle espansioni conteneva una sostituzione di comando, l'exitstatus del comando è lo stato di uscita dell'ultima sostituzione di comando eseguita.
Citando da BASHFAQ/002:
Come posso memorizzare il valore restituito e/o l'output di un comando in una variabile?
...
output=$(command)
status=$?
L'assegnazione a
output
non ha effetto sucommand
lo stato di uscita di , che è ancora in$?
.