/ / Bash: como interromper este script quando há um CTRL-C? - bash, interromper, copiar e colar

Bash: como interromper este script quando há um CTRL-C? - bash, interromper, copiar e colar

Eu escrevi um pequeno script Bash para encontrar todos os changesets do Mercurial (a partir da dica) que contém a string passada no argumento:

#!/bin/bash

CNT=$(hg tip | awk "{ print $2 }" | head -c 3)
while [ $CNT -gt 0 ]
do
echo rev $CNT
hg log -v -r$CNT | grep $1
let CNT=CNT-1
done

Se eu o interromper pressionando ctrl-c, na maioria das vezes o comando atualmente executado é "hg log" e é esse comando que é interrompido, mas meu script continua.

Eu estava pensando em verificar o status de retorno de "hg log", mas porque eu estou piping-lo em grep eu não estou muito certo de como fazê-lo ...

Como devo proceder ao sair deste script quandoestá interrompido? (btw eu não sei se esse script é bom para o que eu quero fazer, mas faz o trabalho e de qualquer maneira eu estou interessado no problema "interrompido")

Respostas:

5 para resposta № 1

Reescreva seu script assim, usando a matriz $ PIPESTATUS para verificar uma falha:

#!/bin/bash

CNT=$(hg tip | awk "{ print $2 }" | head -c 3)
while [ $CNT -gt 0 ]
do
echo rev $CNT
hg log -v -r$CNT | grep $1
if [ 0 -ne ${PIPESTATUS[0]} ] ; then
echo hg failed
exit
fi
let CNT=CNT-1
done

6 para resposta № 2

Coloque no início do seu script: trap "echo interrupted; exit" INT

Editar: Como observado nos comentários abaixo, provavelmente não funciona para o programa do OP devido ao pipe. o $PIPESTATUS A solução funciona, mas pode ser mais simples definir o script para sair se qualquer programa no canal sair com um status de erro: set -e -o pipefail


1 para resposta № 3

o $PIPESTATUS variável permitirá que você verifique os resultados de cada membro do pipe.