Я записал крошечный сценарий Bash для нахождения всего Подвижного changesets (начинающий с подсказки), который содержит строку, переданную в аргументе:
#!/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
Если я прерываю его путем удара ctrl-c, как правило, команда, в настоящее время выполняемая, является "hg журналом", и это - которые управляют, чтобы это было прервано, но затем мой сценарий продолжается.
Я затем думал о проверке статуса возврата "hg журнал", но потому что я передаю его по каналу в grep, я не слишком уверен относительно того, как пойти об этом...
Как я должен пойти о выходе из этого сценария, когда он прерван? (btw я не знаю, способен ли тот сценарий ко всем для того, что я хочу сделать, но он делает задание, и так или иначе я интересуюсь "прерванной" проблемой),
Перепишите свой скрипт следующим образом, используя массив $PIPESTATUS для проверки сбоя:
#!/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
Поместите в начале вашего скрипта: trap 'echo interrupted; exit 'INT
Изменить: Как отмечено в комментариях ниже, вероятно, не работает для программы OP из-за канала. Решение $ PIPESTATUS
работает, но может быть проще настроить сценарий для выхода, если какая-либо программа в конвейере завершается со статусом ошибки: set -e -o pipefail
Переменная $ PIPESTATUS
позволит вам проверить результаты каждого члена канала.