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.