Como posso cancelar o resto de uma lista de comandos no Bash?

10

No Bash, às vezes eu digito uma lista de comandos e clico < kbd> Enter , e só depois perceber que há um erro com algum comando próximo ao final da lista. Eu sei que se eu pressionar Ctrl + C ele terminará o comando atualmente em execução e cancelará o resto da lista. Existe alguma maneira de cancelar o resto da lista sem terminar o comando atualmente em execução?

Por exemplo, digamos que eu digitei algo como

foo; bar

ou

foo && bar

onde foo é um comando de longa duração que é muito importante não interromper, e bar faz algo irreversível e indesejado (digamos, shutdown -h now ou rm -rf / ). Enquanto o foo ainda está em execução, existe uma maneira geral de dizer ao shell para deixar foo terminar, mas não executar bar depois? (Sim, eu poderia alterar as permissões em bar para que não seja executável, mas isso não é particularmente conveniente se bar for algo como rm que eu quero usar enquanto isso, nem vai funcionar se eu não usar t possui bar ou se bar é um builtin.)

    
por Psychonaut 02.04.2018 / 10:06

1 resposta

3

Eu observei que usar Ctrl Z para mudar o programa para um processo em segundo plano faz o truque.

foo && bar

Obrigado a @Arkadiusz Drabczyk por apontar nos comentários que foo; bar não dá o controle da maneira necessária.

Então:

^Z

[1]+  Stopped                 foo

O comando pára apenas a primeira tarefa e

fg %1

Isso traz apenas a tarefa foo para o primeiro plano e conclui a tarefa e sai.

PS: Isso pode ser verificado com dois scripts gravados em um arquivo. O primeiro dormindo por alguns segundos para dar tempo de ser colocado de volta.

Estou perdido porque o Ctrl Z manipula apenas o comando em execução e deixa o resto. Gostaria de conhecer.

    
por 02.04.2018 / 20:16