La mayoría de los shells proporcionan funciones como &&
y ;
encadenar la ejecución de comandos de ciertas maneras. Pero, ¿qué pasa si un comando ya se está ejecutando? ¿Puedo agregar de alguna manera otro comando para que se ejecute dependiendo del resultado del primero?
Digamos que corrí
$ /bin/myprog
some output...
Pero realmente quería /bin/myprog && /usr/bin/mycleanup
. No puedo matar myprog
y reiniciar todo porque se perdería demasiado tiempo. Puedo Ctrl+ Zit y fg
/ bg
si es necesario. ¿Esto me permite encadenar otro comando?
¡Estoy interesado principalmente en bash, pero las respuestas para todos los shells comunes son bienvenidas!
%
,%1
y$!
. Es importante proporcionar el PID o el segundo comando siempre se ejecutará.wait
no proporcionará el resultado deseado. Es común usar las formas cortas, ya que son menos propensas a los errores tipográficos.fg
vuelve con el código de salida del programa que reanuda. Por lo tanto, puede suspender su programa ^Zy luego usarlofg && ...
para reanudarlo.fuente
myprog
por segunda vez hacefg
que finalice con el código de salida 20, que no es cero, por lo que elmycleanup
comando encadenado no se ejecuta.No estoy seguro de si lo que está pidiendo es posible, pero si todavía tiene el shell desde el que inició el programa, siempre puede verificar
$?
el estado de salida del último proceso:fuente
wait
comando en Bash.Si el trabajo está en primer plano, cualquiera de estos comandos tendría el mismo comportamiento que espera.
NOTA: $? contendrá el estado de retorno del programa en ejecución cuando salga.
Esto indica explícitamente qué haría el shell si hubiera ingresado originalmente el comando.
Si el primer comando no está leyendo
stdin
y se está ejecutando en primer plano, se puede ingresar el nuevo comando mientras se ejecuta el primer comando. El shell lo leerá y ejecutará cuando se ejecute el primer comando. Si el comando se ejecutará en segundo plano, es poco probable que esté leyendostdin
.EDITAR:
WAIT
también se puede usar poner el trabajo en segundo plano y usar el comando. Esto debe hacerse con cuidado si otros trabajos también se han ejecutado en segundo plano. Se requiere una especificación de trabajo para que elWAIT
comando devuelva el estado del trabajo esperado.fuente
wait
tampoco es ideal. La ventaja, en mi opinión, es que nos da una API más clara con la que estamos tratando. Escribir más comandos en la línea de comando después de que algo se está ejecutando me pareció un poco raro.wait
todavía sufre de no obtener un enlace directo al PID en ejecución, wrt el estado de retorno. Sin embargo, esto parece ser un problema más con la forma en que Bash implementa las cosas: stackoverflow.com/questions/356100/… . Entonces esto podría ser tan bueno como sea posible.