Вы задаете неправильный вопрос.
Следует ожидать поведения в вашем втором эксперименте. Вы не указали имя файла (или имена) в командной строке, поэтому awk
читает стандартный ввод. Он читает по одной строке за раз, пока не достигнет конца файла (как это было бы при чтении из реального файла). И он выполняет правила, которые вы указали для каждой строки; пустые строки не имеют значения. Тогда: ctrl-C
- нецивилизованный способ прекратить программу грубой силой; правильный способ - выдать ctrl-D
, отмечая конец «файла» и позволяя awk
нормально завершиться.
Обратите внимание на путаницу в вашем вопросе между «выходом из l oop» "и" завершение программы ". L oop заканчивается, когда выполняется условие выхода, затем awk
переходит к следующей строке ввода. В общих чертах, выход из al oop, который является частью правил программы, не имеет никакого отношения к завершению самой программы awk
.
"Неожиданное" поведение в вашем first эксперимент. Там тоже awk
читает со стандартного ввода; почему он не ждет EOF (ctrl-D
) перед выходом, хотя думал, что правила BEGIN будут выполняться только один раз?
Ответ - «потому что это заданное поведение». Например: https://www.gnu.org/software/gawk/manual/html_node/Using-BEGIN_002fEND.html
Если в программе awk
есть только правила BEGIN
и других правил нет, то программа завершается после выполнения правил BEGIN
.
Вам также может понравиться чтение сноски:
Оригинальная версия awk
продолжала читать и игнорировать ввод, пока не был замечен конец файла.
Я бы сказал, что «оригинальная версия» делала «правильные вещи», но это, вероятно, смущало слишком многих пользователей, поэтому поведение было изменено.
По крайней мере, это GNU "указанное поведение"; Я не знаю, что говорит стандарт POSIX.