Я использую приложение командной строки, которое по сути представляет собой набор сценариев оболочки bash. Приложение было написано для запуска на BSD / OSX, а также на Linux. Один из скриптов опирается на awk. Он содержит две команды awk: одна написана для nawk (стандартная реализация BSD awk) и одна написана для gawk (реализация GNU awk).
Эти две команды awk не совместимы с различными средами; в частности, команда nawk не выполняется при запуске с gawk. Сценарий проверяет имя ядра (т.е. uname -s
), чтобы определить среду хоста, а затем запускает соответствующую команду awk. Однако я предпочитаю работать на Mac OS X с установленными основными утилитами GNU, поэтому скрипт не запускается правильно.
В процессе размышлений о том, как лучше всего исправить эту ошибку, мне пришло в голову, что было бы неплохо узнать, как программно различать различные варианты общих утилит командной строки, предпочтительно относительно надежным и переносимым способом.
Я заметил, что nawk не принимает флаг '-V' для печати информации о версии, поэтому я подумал, что что-то вроде следующего должно работать:
awk -V &>/dev/null && echo gawk || echo nawk
Другой вариант может быть:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Кажется, это работает в двух моих средах тестирования (OS X и CentOS). Вот мои вопросы:
- Это лучший путь?
- Есть ли способ расширить это для обработки других вариаций awk (например, mawk, jawk и т. Д.)?
- Стоит ли беспокоиться о других версиях awk?
Я должен также упомянуть, что я знаю очень мало о awk.
источник
awk -Wv
вместо среды хостаawk
используется, и вместо этого кодировать в спецификацию POSIX .Ответы:
В качестве альтернативы test is awk является символической ссылкой:
источник
Попробуйте использовать
which
команду и используйте ее код выхода.затем отформатируйте ваш скрипт, чтобы использовать переменную в качестве команды
будет читаться как
если
which
найдет nawk. В противном случае это будет использоватьgawk
источник
command
это встроенная bash, вы можете использовать другое имя для своей переменной, и вы также можете увидеть невероятно подробный ответ о том, почему для многих оболочек есть лучшие альтернативыwhich
на unix.stackexchange.com/a/85250/109842GNU Awk часто устанавливается как
gawk
, сawk
как символическая ссылка на него в системах , где GNU является по умолчанию. Я полагаю, что это относится к системам BSD и OS X, поскольку они уже есть своиawk
.источник
Грязный хак
nawk-only-function()
существуют только наnawk
источник
Я, вероятно, попытался бы использовать макрос AC_PROG_AWK m4 в autoconf, чтобы выбрать один из них, упорядочив их соответствующим образом. Это, вероятно, излишне, хотя
источник