Как я могу подавить предупреждения о совместимости (g) awk?

Я хочу использовать некоторые gawk расширения стандарта awk, например mktime(). В то же время я хочу использовать опцию --lint=fatal, потому что я предпочитаю позволить процессу завершиться ошибкой, чем заставить его автоматически генерировать потенциально неверные данные. Однако есть кое-что, чего я не понимаю:

$ gawk --lint=fatal 'BEGIN { foo = mktime("2013 01 01 12 00 00"); }' 
gawk: cmd. line:1: fatal: `mktime' is a gawk extension

Я не указывал параметры --posix или --traditional, поэтому должны присутствовать gawk расширения. Как только я уменьшу строгость (--lint=warning), скрипт заработает. Чтобы использовать строгие проверки, мне нужно было бы gawk сказать что-то вроде Я знаю, что использую ваш расширенный набор функций и что я больше не совместим с исходной awk спецификацией, и меня устраивает это. Как я могу это сделать?


person vwegert    schedule 25.05.2013    source источник
comment
Это, наверное, самая неприятная проблема в gawk. --lint был бы очень полезен для перехвата неопределенных переменных, если бы он не приставал ко мне по поводу использования ENDFILE, обязательной для меня функции. Это все еще проблема в gawk 4.2.1.   -  person proski    schedule 17.07.2018


Ответы (2)


Это невозможно сделать из самого awk. Начиная с man gawk версии 4.1.0, 9 мая 2013 г .:

--lint [= значение]

Предоставьте предупреждения о конструкциях, которые являются сомнительными или непереносимыми для других реализаций AWK. Если указан необязательный аргумент fatal, предупреждения о линтах становятся фатальными ошибками. Это может быть радикально, но его использование, безусловно, будет способствовать разработке более чистых программ AWK. С необязательным аргументом invalid выводятся только предупреждения о вещах, которые действительно недействительны. (Это еще не полностью реализовано.)

Вы можете написать простой сценарий-оболочку для синтаксического анализа stderr и отображения только того предупреждения, которое вы хотите видеть.

person Chris Seymour    schedule 25.05.2013
comment
Проблема не в отображении предупреждений, проблема в том, что я хочу, чтобы make прерывался всякий раз, когда, скажем, substr() пробегает конец входного файла ... - person vwegert; 25.05.2013
comment
Как насчет того, чтобы придерживаться --lint и заменить вызовы gawk функций, таких как mktime(), системными вызовами, т.е. system("date") и т. Д. - person Chris Seymour; 25.05.2013
comment
Это был бы вариант - что бы я сделал с strftime()? - person vwegert; 25.05.2013
comment
Используйте date stackoverflow.com/questions/6508819/ - person Chris Seymour; 25.05.2013

Я использую эту обертку для глаз

#! /bin/bash
AWK="/usr/bin/gawk --lint"
exec 3>&1
set -o pipefail
$AWK "$@" 2>&1 1>&3 | { grep -v 'is a gawk extension$' || test $? = 1; }

Дескриптор файла 3 становится копией stdout. Когда gawk запущен, его stdout переходит в дескриптор скопированного файла (то есть stdout). Stderr gawk переходит на stdout и через конвейер в grep, а затем вывод grep отправляется обратно на stderr.

Если gawk не работает, сценарий завершает работу с кодом ошибки из-за параметра pipefail. Если grep не может произвести вывод (т.е. он отфильтровывает все предупреждения), сценарий все равно завершается успешно. Для других ошибок grep сценарий не работает.

Сохраните оболочку как gawk или awk где-нибудь в вашем PATH и убедитесь, что этот каталог отображается в PATH перед /usr/bin.

Теперь у вас есть умная awk, которая предупреждает только о проблемах, которые вас волнуют.

person proski    schedule 24.07.2018