Я использую приложение командной строки, которое по сути представляет собой набор сценариев оболочки 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 .