Awk зависает, когда я направляюсь к файлу

Итак, когда я запускаю это на 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

Это работает нормально. Я делаю что-то не так с моим перенаправлением? Есть ли что-то еще, что я делаю неправильно здесь?

«чтение из» (<) != «запись в» (>>).

Ed Morton 10.04.2019 19:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
278
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Анализ 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 the BEGIN action contains no getline function, awk shall exit without reading its input when the last statement in the last BEGIN action is executed. If an awk program consists of only actions with the pattern END or only actions with the patterns BEGIN and END, the input shall be read before the statements in the END 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

Другие вопросы по теме