No Bash, ocasionalmente digito uma lista de comandos e bato Enter, e só depois percebo que há um erro com algum comando perto do final da lista. Sei que, se pressionar Ctrl+ C, encerrará o comando em execução no momento e cancelará o restante da lista. Existe alguma maneira de cancelar o restante da lista sem encerrar o comando em execução no momento?
Por exemplo, digamos que digitei algo como
foo; bar
ou
foo && bar
Onde foo
é um comando de longa duração que é muito importante para não interromper e bar
faz algo irreversível e indesejado (digamos, shutdown -h now
ou rm -rf /
). Enquanto foo
ainda está em execução, existe uma maneira geral de dizer ao shell para deixar foo
terminar, mas não para executar bar
depois? (Sim, eu poderia alterar as permissões bar
para que não sejam executáveis, mas isso não é particularmente conveniente se bar
é algo rm
que eu quero usar nesse meio tempo, nem funcionará se eu não for o proprietário bar
ou se bar
for um built-in.)
fonte
bar
comando parasome_command
:^bar^some_command
antes de ser executado.Respostas:
Eu observei que usar CtrlZpara mudar o programa para um processo em segundo plano faz o truque.
Agradecemos a @Arkadiusz Drabczyk por apontá-lo em comentários que
foo; bar
não dão controle da maneira necessária.Então:
O comando para apenas a primeira tarefa e
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 dorme por alguns segundos para dar tempo para ser recolocado.
Estou perdido por que os CtrlZmanipuladores apenas o comando em execução e deixa o resto. Gostaria de conhecer.
fonte
bash
versão você usa? Eu usoGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Eu escrevi 2 scripts bash que gravam em arquivos diferenteswrite1.sh
:: pastebin.com/rbKmdWgB ewrite2.sh
: pastebin.com/bNx3VRws . Eu executá-los assim:./write1.sh ; ./write2.sh
. O primeiro script ecoawrote 1
por algumas vezes, pressionoC-z
, diz[1]+ Stopped ./write1.sh
e posso ver imediatamente a saída do segundo script:wrote 2
sendo repetidamente repetido.command1 && command2
pipelines é queControl-z
enviaSIGCHLD
sinal para o processo. Pode ser verificado comecho $?
.Bash
então vê que o primeiro processo não foi concluído com êxito e não executa os próximos processos.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Sim, acho que você está certo.foo; bar
não pode ser controlado da maneira desejada. Mas podemos fazer a parada necessária do segundo processo comCtrl+Z
se o comando for executadofoo && bar
. Vou atualizar a resposta. Obrigado por apontar.bar
ainda está suspenso e aparece najobs
saída, portanto provavelmente também deve ser eliminado .