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 à
outputn'a aucun effet surcommandle statut de sortie de , qui est toujours en$?.