Самый простой; он разрешает трафик в обоих направлениях, если вы сначала что-то запрашиваете. Вы, вероятно, не можете выполнить эхо-запрос, потому что состояние не разрешает никаких возвращаемых данных.
Тест не является простым тестом на успешность выполнения команды. Когда процесс завершается с помощью SIGINT, его статус выхода можно прочитать с помощью wait(2)
. Используя WIFSIGNALED
и WTERMSIG
, bash может определить, был ли дочерний процесс (в данном случае sudo )уничтожен непосредственно сигналом или нет.
Вот результат этого системного вызова при нажатии Ctrl+C вcat
(согласноstrace
):
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGINT}], 0, NULL) = 9357
А вот результат при нажатии Ctrl+C вsudo -S sleep 4
:
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 9479
Для полноты картины вот результат нажатия Ctrl+Cping localhost
:
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9710
Судя по всему, команда sudo
обрабатывает сигнал INT так, что он просто завершает работу, в отличие от, например,. sleep
. Таким образом, Bash считает, что ему не нужно уничтожать себя в своем обработчике по умолчанию для SIGNIT :
bash is among a few shells that implement a wait and cooperative exit approach at handling SIGINT/SIGQUIT delivery. When interpreting a script, upon receiving a SIGINT, it doesn't exit straight away but instead waits for the currently running command to return and only exits (by killing itself with SIGINT) if that command was also killed by that SIGINT. The idea is that if your script calls vi for instance, and you press Ctrl+C within vi to cancel an action, that should not be considered as a request to abort the script.
Вы можете переопределить это поведение, определив ловушку для SIGINT:
trap 'trap - INT; kill -s INT $$' INT
Ссылка:https://mywiki.wooledge.org/SignalTrap(Главы 4 и 5)