Bash: как прервать этот сценарий, когда существует CTRL-C?

Я записал крошечный сценарий 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 я не знаю, способен ли тот сценарий ко всем для того, что я хочу сделать, но он делает задание, и так или иначе я интересуюсь "прерванной" проблемой),

6
задан SyntaxT3rr0r 31 March 2010 в 09:03
поделиться

3 ответа

Перепишите свой скрипт следующим образом, используя массив $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
5
ответ дан 9 December 2019 в 20:41
поделиться

Поместите в начале вашего скрипта: trap 'echo interrupted; exit 'INT

Изменить: Как отмечено в комментариях ниже, вероятно, не работает для программы OP из-за канала. Решение $ PIPESTATUS работает, но может быть проще настроить сценарий для выхода, если какая-либо программа в конвейере завершается со статусом ошибки: set -e -o pipefail

6
ответ дан 9 December 2019 в 20:41
поделиться

Переменная $ PIPESTATUS позволит вам проверить результаты каждого члена канала.

1
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: