2010-03-31 18 views
19

Imaginemos que tengo una escritura del golpe, en el que llamo a esto:¿Es posible obtener el código de salida de una subshell?

bash -c "some_command" 
do something with code of some_command here 

¿Es posible obtener el código de some_command? No estoy ejecutando some_command directamente en el shell que ejecuta el script porque no quiero modificar su entorno.

+0

No estoy seguro de sus motivos para ejecutar de forma indirecta: esa subshell hereda el entorno del script de llamada. Simplemente intente 'exportar FOO =" foo "; bash -c 'echo $ FOO'' (comillas simples, por lo que no se expande hasta que subshell lo ejecute). – Cascabel

+2

Hereda el entorno, pero no modificará el entorno para el shell actual. Cualquier modificación que haga al env. los vars desaparecerán cuando muera. – Geo

+0

Si quiere ejecutar algo sin arruinar el shell primario, entonces usaría una subshell, http://tldp.org/LDP/abs/html/subshells.html – slm

Respuesta

22

$? contendrá el código de retorno de some_command como siempre.

Por supuesto, también podría contener un código de bash, en caso de que algo saliera mal antes de que tu comando pudiera incluso ejecutarse (nombre de archivo incorrecto, etc.).

6

Puede usar la variable $?, revise la documentación de bash para esto, almacena el estado de salida del último comando.

Además, es posible que desee verificar los bloques de comandos estilo bracket de bash (por ejemplo, comm1 && (comm2 || comm3) && comm4), siempre se ejecutan en una subshell sin alterar el entorno actual, ¡y son más potentes también!

EDITAR: Por ejemplo, al usar bloques de estilo (en comparación con bash -c 'command', no tiene que preocuparse de escanear cadenas de argumentos con espacios, o cualquier otra sintaxis especial de shell. Usas directamente la sintaxis del shell, es una parte normal del resto del código.

+3

En otras palabras, '(some_command)' en lugar de 'bash -c" some_command "' –

18

Aquí es una ilustración de $? y el paréntesis subnivel mencionado por Paggas y Matti:

$ (exit a); echo $? 
-bash: exit: a: numeric argument required 255 
$ (exit 33); echo $? 
33 

En el primer caso, el código es un error de Bash y en el segundo caso es el código de salida de exit.

+0

¿No quiere decir '$ (...)', y no '$ (...)'? Este último no solo es inválido, sino también muy confuso. – Evi1M4chine

+4

@ Evi1M4chine: el signo de dólar es el mensaje en este caso. No está destinado a ser tipeado. Los paréntesis desnudos configuran una subshell como se menciona en mi respuesta y le permiten obtener el código de salida y no salir del shell principal. –

+1

Ah. Todavía hace las cosas confusas. No es su culpa, sin embargo, que el prompt estándar es el mismo que el indicador de variable. :) – Evi1M4chine

Cuestiones relacionadas