¿Cómo puedo cancelar el resto de una lista de comandos en Bash?

10

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).

Psiconauta
fuente
Puede modificar el último barcomando para some_command: ^bar^some_commandantes de ser ejecutado.
GAD3R
3
@ GAD3R: pero esto no modificará la línea actual, comenzará una nueva.
Arkadiusz Drabczyk

Respuestas:

3

He observado que usar CtrlZpara cambiar el programa a un proceso en segundo plano hace el truco.

foo && bar

Gracias a @Arkadiusz Drabczyk por señalarlo en comentarios que foo; barno dan el control de la manera requerida.

Luego:

^Z

[1]+  Stopped                 foo

El comando detiene solo la primera tarea y

fg %1

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.

Revanth Chetluru
fuente
1
No puedo reproducirlo ¿Qué bashversión usas? Yo uso GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). Escribí 2 scripts de bash que escriben en diferentes archivos write1.sh:: pastebin.com/rbKmdWgB y write2.sh: pastebin.com/bNx3VRws . Les correr así: ./write1.sh ; ./write2.sh. La primera secuencia de comandos se repite wrote 1varias veces, presiono C-z, dice [1]+ Stopped ./write1.shy puedo ver inmediatamente la salida de la segunda secuencia de comandos: wrote 2se repite repetidamente.
Arkadiusz Drabczyk
2
Creo que la razón por la que este método funciona con command1 && command2tuberías es que Control-zenvía SIGCHLDseñales al proceso. Se puede consultar con echo $?. Bashluego ve que el primer proceso no terminó con éxito y no ejecuta los siguientes procesos.
Arkadiusz Drabczyk
Estoy usando 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 proceso Ctrl+Zsi el comando se ejecuta foo && bar. Actualizaré la respuesta. Gracias por señalarlo.
Revanth Chetluru
@ArkadiuszDrabczyk ¿Ctrl-Z no envía SIGTSTP?
muru
@RevanthChetluru nota que bartodavía está suspendido y aparece en la jobssalida, por lo que probablemente también deba eliminarse .
muru