En Bash, ocasionalmente escribiré una lista de comandos y presionaré Enter, y solo más tarde me daré cuenta de que hay un error con algún comando cerca del final de la lista. Sé que si presiono Ctrl+ Cterminará el comando actualmente en ejecución y cancelará el resto de la lista. ¿Hay alguna forma de cancelar el resto de la lista sin terminar el comando actualmente en ejecución?
Por ejemplo, digamos que he escrito algo como
foo; bar
o
foo && bar
donde foo
es un comando de larga duración que es muy importante no interrumpir, y bar
hace algo irreversible y no deseado (por ejemplo, shutdown -h now
o rm -rf /
). Mientras foo
todavía se está ejecutando, ¿hay una forma general de decirle al shell que deje que foo
termine pero que no se ejecute bar
después? (Sí, podría cambiar los permisos bar
para que no sea ejecutable, pero eso no es particularmente conveniente si bar
es algo rm
que quiero usar mientras tanto, ni funcionará si no soy propietario bar
o si bar
es un incorporado).
fuente
bar
comando parasome_command
:^bar^some_command
antes de ser ejecutado.Respuestas:
He observado que usar CtrlZpara cambiar el programa a un proceso en segundo plano hace el truco.
Gracias a @Arkadiusz Drabczyk por señalarlo en comentarios que
foo; bar
no dan el control de la manera requerida.Luego:
El comando detiene solo la primera tarea y
Esto trae solo la tarea
foo
al primer plano y completa la tarea y sale.PD: Esto se puede verificar con dos scripts que escriben en un archivo. El primero durmiendo durante unos segundos para dar tiempo a que lo devuelvan.
No sé por qué CtrlZmaneja solo el comando en ejecución y deja el resto. Me encantaría conocerlo.
fuente
bash
versión usas? Yo usoGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Escribí 2 scripts de bash que escriben en diferentes archivoswrite1.sh
:: pastebin.com/rbKmdWgB ywrite2.sh
: pastebin.com/bNx3VRws . Les correr así:./write1.sh ; ./write2.sh
. La primera secuencia de comandos se repitewrote 1
varias veces, presionoC-z
, dice[1]+ Stopped ./write1.sh
y puedo ver inmediatamente la salida de la segunda secuencia de comandos:wrote 2
se repite repetidamente.command1 && command2
tuberías es queControl-z
envíaSIGCHLD
señales al proceso. Se puede consultar conecho $?
.Bash
luego ve que el primer proceso no terminó con éxito y no ejecuta los siguientes procesos.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Sí, creo que tienes razón.foo; bar
no se puede controlar de la manera deseada. Pero podemos hacer la parada requerida del segundo procesoCtrl+Z
si el comando se ejecutafoo && bar
. Actualizaré la respuesta. Gracias por señalarlo.bar
todavía está suspendido y aparece en lajobs
salida, por lo que probablemente también deba eliminarse .