Tenga en cuenta que este no es el caso cuando se combina con local
, como en local variable="$(command)"
. Ese formulario saldrá con éxito incluso si command
fallado.
Tome este script de Bash por ejemplo:
#!/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
Aquí está el resultado de esto:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
Esto se debe a que local
es en realidad un comando incorporado, y un comando como local variable="$(command)"
llamadas local
después sustituyendo la salida de command
. Entonces obtienes el estado de salida de local
.
Al ejecutar un comando como $(command)
permite que la salida del comando se reemplace a sí misma.
Cuando dices:
a=$(false) # false fails; the output of false is stored in the variable a
la salida producida por el comando false
se almacena en la variable a
. Además, el código de salida es el mismo que produce el comando. help false
diría:
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
Por otro lado, diciendo:
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
hace que el código de salida para la asignación sea a
a devolver que es 0
.
EDITAR:
Citando del manual:
Si una de las expansiones contenía una sustitución de comando, el estado de salida del comando es el estado de salida de la última sustitución de comando realizada.
Citando de BASHFAQ/002:
¿Cómo puedo almacenar el valor de retorno y/o la salida de un comando en una variable?
...
output=$(command)
status=$?
La asignación a output
no tiene efecto en command
el estado de salida de, que todavía está en $?
.