Как работает gawk -e 'BEGIN {' -e 'print "hello"}'? - PullRequest
1 голос
/ 16 апреля 2019

Gawk 5.0.0 был выпущен 12 апреля 2019 года. Проходя через объявление Я нашел это:

Изменения с 4.2.1 до 5.0.0

(...) 11. Пространства имен были реализованы!Смотрите руководство.Одним из следствий этого является то, что файлы, включенные в -i, читаемые в -f и программные сегменты командной строки, должны быть автономными синтаксическими единицами.Например, вы больше не можете делать что-то вроде этого:

gawk -e 'BEGIN {' -e 'print "hello" }'

Мне было любопытно, что такое поведение больше не поддерживается, но, к сожалению, мой Gawk 4.1.3 не дал большого выхода из него:

$ gawk -e 'BEGIN {' -e 'print "hello" }'
gawk: cmd. line:1: BEGIN {
gawk: cmd. line:1:        ^ unexpected newline or end of string

Из того, что я вижу в руководстве к GAWK 4.2, опция -e уже помечена как проблемная:

Руководство пользователя GNU Awk, вкл. Опции

-e текст программы
--source текст программы

Предоставить программуИсходный код в программе-тексте.Эта опция позволяет вам смешивать исходный код в файлах с исходным кодом, который вы вводите в командной строке.Это особенно полезно, когда у вас есть библиотечные функции, которые вы хотите использовать в своих программах командной строки (см. Переменная AWKPATH).

Обратите внимание, что gawk обрабатывает каждую строку, как если бы она заканчивалась символом новой строки (даже если онане делает).Это облегчает сборку всей программы.

ВНИМАНИЕ: В настоящее время не требуется, чтобы каждый программный текст был полным синтаксическим модулем.То есть в настоящее время работает следующее:

$ gawk -e 'BEGIN { a = 5 ;' -e 'print a }'
-| 5

Однако это может измениться в будущем, поэтому не стоит полагаться на эту функцию.

Но, опять же,это терпит неудачу в моей консоли:

$ gawk -e 'BEGIN {a=5; ' -e 'print a }'
gawk: cmd. line:1: BEGIN {a=5; 
gawk: cmd. line:1:             ^ unexpected newline or end of string

Так, что gawk -e 'BEGIN {' -e 'print "hello" }' делает точно на Gawk <5? </p>

1 Ответ

3 голосов
/ 16 апреля 2019

Он делает то, что вы ожидаете - объединяет части в форму gawk 'BEGIN {print "hello" }', а затем выполняет его.На самом деле вы можете увидеть, как gawk объединяет сегменты кода с помощью pretty-printing it:

$ gawk -o- -e 'BEGIN {' -e 'print "hello" }'
BEGIN {
        print "hello"
}

Этот сценарий бесполезен для написания в разделах и конкатенации, но если вы что-то считаетенапример:

$ cat usea.awk
{ a++ }

$ echo foo | gawk -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
6

, тогда вы можете увидеть, что предполагаемая функциональность может быть полезна для смешивания некоторого кода командной строки со скриптами, хранящимися в файлах для запуска:

$ gawk -o- -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
BEGIN {
        a = 5
}

{
        a++
}

END {
        print a
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...