script programacion pasar parametros manejo español ejemplos comandos comando cadenas bash shell zsh exit-code

bash - programacion - shell script comandos



Obtener el código de salida del último comando de shell en otro script (3)

Estoy tratando de reforzar mi script de notificación. La forma en que funciona el script es que lo pongo detrás de un comando de shell de ejecución prolongada y luego se invoca todo tipo de notificaciones después de que el script de ejecución larga termina.

Por ejemplo:

sleep 100; my_notify

Sería bueno obtener el código de salida del script de ejecución larga, el problema es que llamar a my_notify crea un nuevo proceso que no tiene acceso al $? variable.

Comparar:

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID" ls: nonexisting_file: No such file or directory exit code: 1 PPID: 6203

vs.

~ $: ls nonexisting_file; my_notify ls: nonexisting_file: No such file or directory exit code: 0 PPID: 6205

El script my_notify tiene lo siguiente en él:

#!/bin/sh echo "exit code: $?" echo "PPID: $PPID"

Estoy buscando una forma de obtener el código de salida del comando anterior sin cambiar demasiado la estructura del comando. Soy consciente del hecho de que si lo cambio para que funcione más como el time , por ejemplo, my_notify longrunning_command... mi problema estaría resuelto, pero de hecho me gusta que puedo virarlo al final de un comando y me temo que las complicaciones de esto segunda solución

¿Se puede hacer esto o es fundamentalmente incompatible con la forma en que funcionan las conchas?

Mi shell es zsh pero me gustaría que funcione también con bash .


Es incompatible $? solo existe dentro del shell actual; si lo quiere disponible en subprocesos, debe copiarlo en una variable de entorno.

La alternativa es escribir una función de shell que la use de alguna manera.


Un método para implementar esto podría ser el uso de etiquetas EOF y un script maestro que creará su script my_notify.

#!/bin/bash if [ -f my_notify ] ; then rm -rf my_notify fi if [ -f my_temp ] ; then rm -rf my_temp fi retval=`ls non_existent_file &> /dev/null ; echo $?` ppid=$PPID echo "retval=$retval" echo "ppid=$ppid" cat >> my_notify << ''EOF'' #!/bin/bash echo "exit code: $retval" echo " PPID =$ppid" EOF sh my_notify

Puede refinar este script para su propósito.


Realmente necesitarías usar una función de caparazón para lograr eso. Para un script simple como ese debería ser bastante fácil hacerlo funcionar tanto en zsh como en bash. Solo coloque lo siguiente en un archivo:

my_notify() { echo "exit code: $?" echo "PPID: $PPID" }

A continuación, procese ese archivo desde los archivos de inicio de su shell. Aunque como esto se ejecutaría desde su caparazón interactivo, es posible que desee utilizar $$ en lugar de $ PPID.