Bash Break readline на Sigint
Вопрос
Я пытаюсь поймать SIGINT CTRL + C в цикле чтения на розетке, но перерыв, который я прошу, только обработанный после новой линии.Поэтому, когда я Ctrl + C моего приложения, я должен ждать новую строку, чтобы прийти в сокет до перерывов петли / приложение выходит
Это минимальная версия:
trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3
.
Как я могу сразу сломать петлю и выйти из приложения?
Решение
Генеракодицетагкод - это не реальная команда, которую вы можете выполнить, где вы хотите;Это просто синтаксическая конструкция, чтобы отметить точку, где оставить окружающий цикл.Ваш break
не имеет окружающего цикла, поэтому он не имеет смысла (и является ошибкой: break
).
Вам необходимо убить команду bash: break: only meaningful in a `for', `while', or `until' loop
вместо этого:
trap "killRead" SIGINT SIGHUP SIGTERM
killRead() {
kill $(cat /tmp/read.pid)
}
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3 & pid=$!
echo $pid > /tmp/read.pid
wait $pid
.
Конечно, это всего лишь очень грубый раствор, не скрывая любые сообщения об ошибках, выпущенных завершенными сумаслями и т. Д., Но он показывает идею и решает вопрос, о котором вы спрашивали.Для скрытия ожидаемого сообщения об ошибке и т. Д. Вы можете захотеть задать другие вопросы (или просто поиск уже данных ответов здесь; -)