Quando você pressiona Ctrl + C , todo o trabalho (grupo de processos) que recebe o SIGINT, less
intercepta para abortar a pesquisa, mas gunzip
terminará. Para evitar isso, você poderia fazer:
(trap '' INT; gunzip < file.gz) | less
para que gunzip
ignore o SIGINT,
mas note que você não poderá mais interromper gunzip
depois disso.
Para gunzip
, provavelmente está tudo bem, já que tudo que você precisa fazer é sair less
, após o qual gunzip
morrerá de um SIGPIPE da próxima vez que gravar algo, mas para aplicativos que simplesmente não exibem algo, isso seria mais um problema (você ainda seria capaz de usar Ctrl + Z para SIGTSTP ou Ctrl + \ para SIGQUIT).
Observe também que alguns comandos como pv
ou ping
instalam seu próprio manipulador SIGINT, o que reverteria nosso trap '' INT
.
Você pode criar uma função para salvar digitando como:
iless() {
(trap '' INT; "$@") | less
}
iless gunzip < file.gz
Ou:
noint() (trap '' INT; "$@")
noint gunzip < file.gz | less
Mas note que para:
gunzip < file.gz | grep foo | less
você precisaria escrever:
noint gunzip < file.gz | notint grep foo | less
ou:
noint eval 'gunzip < file.gz | grep foo' | less
ou:
iless eval 'gunzip < file.gz | grep foo'
Uma alternativa é usar a substituição do processo:
less -f <(gunzip < file.gz | grep foo)
ou (embora não em zsh
):
less < <(gunzip < file.gz | grep foo)
Nesses casos, o shell não inclui os comandos dentro da substituição do processo em um grupo de processos em primeiro plano (exceto no segundo caso para zsh
). Seu grupo de processos permanece o mesmo que o da shell. Isso significa que eles não recebem um SIGINT quando você pressiona Ctrl + C .
Note que esses processos não serão afetados por Ctrl + Z ou Ctrl + \ .
Testado em zsh
, ksh93
e bash
.