bash - teclado - Ejecute un comando después de otro, incluso si suspendo el primero(Ctrl-z)
control d en linux (2)
Sé que en bash puedo ejecutar un comando tras otro separándolos por punto y coma, como
$ command1; command2
O si solo quiero que command2
ejecute solo si command1
tiene éxito, usando &&
:
$ command1 && command2
Esto funciona, pero si suspendo el command1
usando Ctrl-z
, en el primer caso, ejecuta el command2
inmediatamente, y en el segundo caso, no lo ejecuta en absoluto. ¿Cómo puedo ejecutar los comandos en secuencia, pero aún puedo suspender el primer comando, pero no ejecutar la segunda ejecución hasta que lo reinicié (con fg
) y termine? Preferiría algo tan simple de escribir como sea posible, ya que me gustaría hacerlo de manera interactiva. O tal vez solo necesito establecer una opción en algún lugar.
Por cierto, ¿cuál es el término adecuado para lo que hace Ctrl-z
?
En Bash, cuando coloca un trabajo en segundo plano (utilizando CTRL + Z o &), no espera a que finalice el trabajo y le da un código de salida de cero (éxito). Eso lo has observado, y está documentado en las páginas del manual.
El comportamiento del "Y" lógico, &&, es que se prueba de izquierda a derecha. Cada parte debe tener éxito, por lo que si la primera no tiene éxito, la segunda no se ejecutará. Así que con && ejecuta comandos de izquierda a derecha hasta que uno de ellos falla. La definición de éxito es un código de salida ($?) De cero.
Contraste esto con el "OR" lógico, ||, que ejecuta comandos de izquierda a derecha hasta que uno de ellos funciona .
La explicación de la solución de subshell proporcionada por @NPE también se puede encontrar en las páginas del manual:
Comandos compuestos y secuencias de comandos de la forma ''a; b; c ''no se manejan con gracia cuando se intenta suspender el proceso. Cuando se detiene un proceso, el shell ejecuta inmediatamente el siguiente comando en la secuencia. Basta con colocar la secuencia de comandos entre paréntesis para forzarla en una subshell, que se puede detener como una unidad.
El término adecuado para CTRL + Z es el carácter de suspensión , nuevamente desde las páginas del manual:
Al escribir el carácter de suspensión (normalmente ^ Z, Control-Z) mientras se está ejecutando un proceso, ese proceso se detiene y devuelve el control a bash.
(Siento mucho citar las páginas de man
, pero realmente son tus amigos y vale la pena leerlas)
Si miras a stty -a
verás algo como esto:
susp = ^Z;
Así que puedes alterarlo, de ahí la frase "tipicamente". Sin embargo, no hagas eso, esto confundirá a todos. El controlador del terminal genera una señal SIGTSTP que está atrapada por Bash.
Lo siguiente debe hacerlo:
(command1; command2)
Tenga en cuenta los paréntesis añadidos.