2010-12-12 16 views
34

Este fragmento de código Bash obras que yo hubiera esperado:¿Por qué "local" barre el código de retorno de un comando?

$ fun1() { x=$(false); echo "exit code: $?"; } 
$ fun1 
exit code: 1 

Pero éste, utilizando local, no:

$ fun2() { local x=$(false); echo "exit code: $?"; } 
$ fun2 
exit code: 0 

¿Puede alguien explicar ¿por qué local barrer el código de retorno del comando ?

+1

Ver https://lists.gnu.org/archive/html/bug-bash/2010-03/msg00007.html – tokland

Respuesta

41

La razón por la que el código con local devuelve 0 es porque $? "Se expande hasta el estado de salida de la última línea de primer plano ejecutada". Por lo tanto $? está devolviendo el éxito de local

Puede solucionar este comportamiento mediante la separación de la declaración de x de la inicialización de x así:

$ fun() { local x; x=$(false); echo "exit code: $?"; }; fun 
exit code: 1 
+0

Normalmente prefiero definir y usar una variable en una sola línea, pero sí, esto es un solución aceptable. – tokland

+4

Para el registro, el problema se discute en la wiki de BashPitfalls: http://mywiki.wooledge.org/BashPitfalls#local_varname.3D.24.28command.29 – tokland

+0

pensé que me estaba volviendo loco ... ¡gracias! – peteroak

2

El código de retorno del comando local oscurece el código de retorno de false

+1

Sí, lo entiendo, pero siendo local una palabra clave especial, espero no obscurecerla. Supongo que fue una suposición falsa. – tokland

+3

No es una "palabra clave especial", es un shell incorporado. Incluso los builtins tienen valores de retorno. –

+0

gracias @Ignacio, tienes razón, tendré que revisar mis scripts para usos incorrectos de "VAR local = $ (comando) || return 1" – tokland

Cuestiones relacionadas