Notez que ce n'est pas le cas lorsqu'il est combiné avec local
, comme dans local variable="$(command)"
. Ce formulaire se fermera avec succès même si command
échoué.
Prenez ce script Bash par exemple :
#!/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
Voici le résultat :
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
C'est parce que local
est en fait une commande intégrée, et une commande comme local variable="$(command)"
appelle local
après en remplaçant la sortie de command
. Vous obtenez donc le statut de sortie de local
.
Lors de l'exécution d'une commande en tant que $(command)
permet à la sortie de la commande de se remplacer elle-même.
Lorsque vous dites :
a=$(false) # false fails; the output of false is stored in the variable a
la sortie produite par la commande false
est stocké dans la variable a
. De plus, le code de sortie est le même que celui produit par la commande. help false
dirait :
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
D'autre part, en disant :
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
provoque le code de sortie de l'affectation à a
à retourner qui est 0
.
MODIFIER :
Citation du manuel :
Si l'une des extensions contenait une substitution de commande, l'état de sortie de la commande est l'état de sortie de la dernière substitution de commande effectuée.
Citation de BASHFAQ/002 :
Comment puis-je stocker la valeur de retour et/ou la sortie d'une commande dans une variable ?
...
output=$(command)
status=$?
L'affectation à
output
n'a aucun effet surcommand
le statut de sortie de , qui est toujours en$?
.