#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
Imprime el valor vacío. Esperaba:
1
¿Por qué a la t1
variable no se le asigna el valor de retorno del comando de salida 1
?
bash
shell
variable
command-substitution
Gilles 'SO- deja de ser malvado'
fuente
fuente
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
El código de salida se almacenó en $? variable. Usando la sustitución de comandos solo captura la salida, debe usar (...) para crear subshell :
fuente
t1=$?
es usarlo, ¿no? y no quedaría$?
golpeado por la operación de asignación? Creo que estoy preguntando si no debería serprintf '%d\n' "${t1}"
En
bash
esto funciona:Tiene que ver con el orden de evaluación de comandos y asignación de variables.
local
tiene un valor de retorno propio, y es el comando que se está ejecutando actualmente, no la sustitución del comando. La razón por la que cosas como ...... puede devolver 1 es porque nunca hay un retorno en ese comando, excepto por la ejecución de la subshell para asignar
$x
el valor, por lo$?
que no se bloquea como lo hace prácticamente en cualquier otro caso en el que se usan sustituciones de comandos.De todos modos, con la
local
que no consigue clobbered - pero si lo detecta en el momento justo - que es, mientras que las expansiones aún están siendo evaluados y antes delocal
rutinas 's tienen la oportunidad de darle una paliza que - todavía se puede asignarla....huellas dactilares...
Sin embargo, debe saber que en muchos shells no puede confiar en que
$?
se establezca a mitad de la evaluación de esa manera. De hecho, probablemente se deba a que esos proyectiles no se molestan en reevaluar en cada coyuntura posible, tal vez lobash
hace, lo cual diría que es probablemente un mejor comportamiento quebash
el de ellos. ¿Realmente desea que su intérprete evalúe recursivamente valores de bucle que es muy probable que se sobrescriban antes de tener la oportunidad de usarlos?De todos modos, así es como puedes hacer eso.
fuente
Dependiendo de por qué está tratando de obtener el código de salida, también puede ejecutarlo,
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
lo que no hace nada con la salida del comando, solo evalúa el código de salida de la ejecución del comando. Puede agregaror
(or
$ (around the command and you'll still get the same results. A better example might be
si grep -q 'somestring' algún archivo; luego repita "¿El código de salida de somestring encontrado es $?"; De lo contrario, "¿No encontró el código de salida de somestring es $?"; Fi`.También puede probar el código de retorno de una función que puede ser un
return 3
código de retorno explícito o implícito que es el resultado del último comando, en este caso debe tener cuidado de no tener unecho
al final del función, de lo contrario enmascara / restablece el código de salida anterior.Finalmente, un truco sucio ya que no puedes hacerlo
VAR=(SOME_COMMAND)
porqueVAR=()
es una definición de matriz, por lo que debes hacerloVAR=( $(echo 'Some value') )
.fuente