Итак, когда я запускаю это на Mac:
awk 'END { for (name in ENVIRON) {
print "key: "name; }
}' >> app-deployment.yaml
awk просто зависает. Если я изменю его, чтобы просто напечатать на /dev/null вот так
awk 'END { for (name in ENVIRON) {
print "key: "name; }
}' < /dev/null
Это работает нормально. Я делаю что-то не так с моим перенаправлением? Есть ли что-то еще, что я делаю неправильно здесь?





Анализ Code1 OP:
awk 'END { for (name in ENVIRON) {
print "key: "name; }
}' >> app-deployment.yaml
Не имеет никакого Input_file, переданного в блок awk и END в любом awk коде, требует передачи какого-либо Input_file, он зависает там, так как НЕ может его найти.
Анализ Code2 OP:
awk 'END { for (name in ENVIRON) {
print "key: "name; }
}' < /dev/null
Теперь вы передаете /dev/null в качестве входных данных для awk (хотя у него НЕ будет содержимого, которое будет читать awk, но ему все же будет передан вход), поэтому согласно правилу, как только Input_file завершит обработку END блочных процессов, в этом случае поскольку НЕТ содержимого, поэтому должна происходить печать разделов END.
Чтобы код awk работал без прохождения пути Input_file: В случае, если кто-то хочет awk работать без Input_file, используйте только BEGIN раздел, который в соответствии с man awk страницей будет выполнен до того, как Input_file будет обработан, поэтому даже вы НЕ передаете какой-либо Input_file, он НЕ будет ждать его присутствия, и как только BEGIN раздел будет выполнен, он выйдет из программы.
Измените END на BEGIN, чтобы иметь возможность работать без ввода:
awk 'BEGIN { for (name in ENVIRON) {
print "key: "name; }
}' >> app-deployment.yaml
If an awk program consists of only actions with the pattern
BEGIN, and theBEGINaction contains nogetlinefunction, awk shall exit without reading its input when the last statement in the lastBEGINaction is executed. If an awk program consists of only actions with the patternENDor only actions with the patternsBEGINandEND, the input shall be read before the statements in theENDactions are executed.source: POSIX awk Standard
Итак, вкратце:
awk 'BEGIN{ action-without-getline }': awk завершает работу без обработки входных файловawk 'BEGIN{ action-with-getline }': awk завершает работу после обработки входных файловawk 'END{ action }': awk завершает работу после обработки входных файловawk 'BEGIN{action}END{ action }': awk завершает работу после обработки входных файловawk 'BEGIN{action; exit}END{ action }': awk завершает работу без обработки входных файловНо что, если указаны входные файлы нет:
Execution of the awk program shall start by first executing the actions associated with all
BEGINpatterns in the order they occur in the program. Then each file operand (or standard input if no files were specified) shall be processed in turn ...source: POSIX awk Standard
Так это просто означает, что
$ awk 'END{action}'
не будет зависать, а ожидает ввода от /dev/stdin
«чтение из» (
<) != «запись в» (>>).