Všimněte si, že tomu tak není v kombinaci s local
, jako v local variable="$(command)"
. Tento formulář bude úspěšně ukončen, i když command
selhalo.
Vezměte si například tento skript Bash:
#!/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
Zde je výstup tohoto:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
Důvodem je local
je ve skutečnosti vestavěný příkaz a příkaz jako local variable="$(command)"
volání local
po nahrazením výstupu command
. Stav ukončení tedy získáte z local
.
Po provedení příkazu jako $(command)
umožňuje, aby se výstup příkazu nahradil.
Když řeknete:
a=$(false) # false fails; the output of false is stored in the variable a
výstup vytvořený příkazem false
je uložena v proměnné a
. Kromě toho je výstupní kód stejný, jako byl vytvořen příkazem. help false
by řekl:
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
Na druhou stranu říká:
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
způsobí, že výstupní kód přiřazení bude a
má být vráceno, což je 0
.
EDIT:
Citace z manuálu:
Pokud jedna z expanzí obsahovala náhradu příkazu, stav ukončení příkazu je stav ukončení poslední provedené náhrady příkazu.
Citace z BASHFAQ/002:
Jak mohu uložit návratovou hodnotu a/nebo výstup příkazu do proměnné?
...
output=$(command)
status=$?
Přiřazení
output
nemá žádný vliv nacommand
stav ukončení, který je stále$?
.