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 № 1Reescreva 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.