Итак, когда я запускаю это на 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 theBEGIN
action contains nogetline
function, awk shall exit without reading its input when the last statement in the lastBEGIN
action is executed. If an awk program consists of only actions with the patternEND
or only actions with the patternsBEGIN
andEND
, the input shall be read before the statements in theEND
actions 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
BEGIN
patterns 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
«чтение из» (
<
) != «запись в» (>>
).