Por que ctrl + c no console mata o processo em segundo plano

5

Você poderia explicar por que Ctrl + C no meu bash shell afeta o comando que foi executado anteriormente em segundo plano com:

`./my_script.sh 1` &

O comando imediatamente termina a execução com 130 código:

[1]+  Exit 130              `./my_script.sh 1` &

O comportamento habitual de Ctrl + C é matar o processo de primeiro plano. E o que acontece aqui?

Edit 1: (Meus pensamentos) talvez algo relacionado a backticks - o processo subshell aqui começa e de alguma forma recebe Ctrl + C quando o processo pai recebe

Edit 2: eu achei que Ctrl + C pára todos os processos em segundo plano que foram executados a partir do shell atual com o uso de backticks.

John_West
fonte
O comando anterior entrou no seu shell?
bgStack15
@bgStack Não entendo: é ./my_script.sh 1 & amp; . Ou você pergunta sobre o último comando antes do Ctrl-C?
John_West
Esqueceu-se de escapar dos backticks no comentário anterior. Deve ler como: `./my_script.sh 1` &
John_West

Respostas:

1

Quando você escreve o comando

`./my_script.sh 1` &

você está fazendo um substituição de comando (ver abaixo).
Praticamente você está executando um subcamada (aquele para os backticks `` ) no fundo ( & ) em que executa o seu script ( ./my_script.sh 1 ).

o concha presente está aguardando o final da execução de sua sub-shell para executar sua saída como comandos.
o subcamada está esperando o final do seu roteiro.
Quando você pressiona Ctrl + C você interrompe essa espera, passando o sinal SIGINT para a criança.

Neste momento o atual shell tenta executar como comando a saída obtida até agora ... e gera o erro 130 que significa "Script terminado por Control-C" [ 2 ] .


Com os backticks ``, bem como com $(), na bash você está fazendo um substituição de comando [ 1 ] :

O Bash executa a expansão executando COMMAND e substituindo a substituição de comando pela saída padrão do comando, com todas as novas linhas à direita excluídas.

por exemplo

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

Note que se você executar em segundo plano mais desse tipo de comandos

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

é sempre o shell atual que está aguardando a saída de todos os filhos. Um único Ctrl + C vai acabar com essa espera por todos juntos.

Se, em vez disso, você aguardar o final do script, o shell atual tentará executar sua saída à medida que eles forem concluídos.

Hastur
fonte
Sim, realmente executa a saída! Obrigado pela explicação! E está "passando o sinal SIGINT para a criança "o comportamento padrão de bash? Ou somente quando usando substituição de comando?
John_West
1
O segundo que você disse. BTW fazer alguns testes ... sleep 10; echo ok como script ... &... ctrl c ... aproveite seu tempo!
Hastur