Basicamente, você pode não enviar sinais para uma função de shell específica. Funções são uma ferramenta de conveniência para compor blocos de lógica processual. Isso é semelhante, mas não é equivalente a scripts de shell.
Ao executar um script de shell, o interpretador de linha de comando / shell atualmente em execução, faz com que o interpretador / shell filho execute o script. Bifurcação implica a criação de um novo processo. Esse processo pode ser enviado sinais arbitrários.
Ao executar uma função de shell, não haverá fork (implícito), portanto, nenhum processo dedicado, portanto, nenhum destino para o qual um sinal poderia ser enviado.
Quando você atinge Ctrl-C
no terminal, e o processo ocupado é o próprio shell, ele simplesmente pára o que está fazendo atualmente. No seu exemplo, nem é fácil saber se o sleep
recebe o sinal (para que a função saia porque chega ao fim) ou se a função parou de ser executada.
$ domuch () { for (( i=0; i<1000000; i++)) {} }
também será interrompido por Ctrl-C
, e definitivamente não há nada para enviar um sinal.
Se você quiser enviar um sinal, você deve envolver um sub-shell, colocando suas linhas em um script, ou usando backticks (não tem idéia de como mostrá-las aqui: - /) ou a alternativa $()
notação:
$ doless () { $(sleep 1000) }
Você pode usar o parâmetro $!
special que informa o PID do processo de segundo plano iniciado mais recentemente, mas somente no mesmo shell, então você pode ir:
$ doless &
$ kill -int $!
[1] 30769
[1] + interrupt dosome
Ainda não é a função que recebe o sinal, mas sleep
faz.
Curiosamente, se você enviar o sono para o segundo plano de dentro da função, como em
dotoomuch() () { $(sleep 1000) & }
você não poderá interrompê-lo por meio se Ctrl-C
, embora esteja bloqueando o terminal. Não faço ideia se isso é um comportamento desejado (zsh 4.3.10).