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 fooes un comando de larga duración que es muy importante no interrumpir, y barhace algo irreversible y no deseado (por ejemplo, shutdown -h nowo rm -rf /). Mientras footodavía se está ejecutando, ¿hay una forma general de decirle al shell que deje que footermine pero que no se ejecute bardespués? (Sí, podría cambiar los permisos barpara que no sea ejecutable, pero eso no es particularmente conveniente si bares algo rmque quiero usar mientras tanto, ni funcionará si no soy propietario baro si bares un incorporado).
fuente

barcomando parasome_command:^bar^some_commandantes 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; barno dan el control de la manera requerida.Luego:
El comando detiene solo la primera tarea y
Esto trae solo la tarea
fooal 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
bashversió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 1varias veces, presionoC-z, dice[1]+ Stopped ./write1.shy puedo ver inmediatamente la salida de la segunda secuencia de comandos:wrote 2se repite repetidamente.command1 && command2tuberías es queControl-zenvíaSIGCHLDseñales al proceso. Se puede consultar conecho $?.Bashluego 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; barno se puede controlar de la manera deseada. Pero podemos hacer la parada requerida del segundo procesoCtrl+Zsi el comando se ejecutafoo && bar. Actualizaré la respuesta. Gracias por señalarlo.bartodavía está suspendido y aparece en lajobssalida, por lo que probablemente también deba eliminarse .