
У меня есть bash lopp
как
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
Я прерываю длинный цикл с помощью ввода с клавиатуры, как Ctrl+C
будто Ctrl+C
просто завершаю скрипт. Я ищу альтернативу для продолжения текущего цикла и прерывания цикла после завершения выполнения STUFF
в текущем цикле.
решение1
Один из способов — нажать trap
Control-C и break
выйти из loop
, как в:
#!/bin/bash
trap break INT
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
echo "I have broken out of the interminably long for loop"
trap - INT
sleep 1
echo "END."
Более подробно о том, как это работает, вот ключевые строки:
trap break INT
а также
trap - INT
Мы используем «break», чтобы сообщить ловушке, что мы хотим запустить break, чтобы прервать цикл, когда генерируется сигнал INT
(прерывание, также известное как ) (что происходит при нажатии Ctrl+C).SIGINT
Вместо «break» мы могли бы поместить произвольные команды оболочки в кавычки, и они будут выполнены при генерации заданного сигнала (в нашем случае INT).
Наконец, мы снова запускаем ловушку, чтобы -
восстановить обработчик «INT» до действия по умолчанию.
Вот еще несколько ресурсов для дальнейшего чтения и примеров:
- Статья в Linuxjournal о команде bash trapдает еще несколько примеров использования ловушки и нюансов между различными вариантами
- Страница MIT Confluence о ловушкахохватывает оболочки bash и tcsh
- Руководство для начинающих по использованию «ловушки» для перехвата сигналов и обработки ошибок в скрипте оболочкиэто обширная цитата, показывающая другие сигналы, посылаемые клавиатурой, а также использование
kill -l
для отображения всех сигналов иkill -l SIGNALNAME
поиска их числового значения.