Распространение сценария. Должен ли я использовать / bin / gawk или / usr / bin / gawk для shebang?

Обычно gawk в / bin или / usr / bin? Я бы пошел с #!/usr/bin/env gawk но тогда я не могу использовать аргументы. Прямо сейчас я использую #!/bin/gawk -f . Сценарий очень длинный и содержит много одинарных кавычек и работает со стандартом stdin.

В руководстве GNU Awk есть раздел 1.1.4 Исполняемые программы awk, в которых он использует #! / Bin / awk в своем примере, но продолжает:

Обратите внимание, что во многих системах awk может быть найден в /usr/bin а не в /bin . Пусть покупатель будет бдителен.

Что делают большинство людей? Я читал sed, предположительно, стандартизован в / bin, тогда как perl предположительно стандартизован в / usr / bin (на той же странице, что и sed, но они не позволят мне сделать третью ссылку для этого сообщения). Как насчет awk / gawk? Кто-нибудь знает, что является более распространенным или популярным?

3 Solutions collect form web for “Распространение сценария. Должен ли я использовать / bin / gawk или / usr / bin / gawk для shebang?”

Шебанг не был таким гибким . Могут быть некоторые случаи, когда работает второй параметр , я думаю, что FreeBSD является одним из них.

gawk и большинство утилит, поставляемых с ОС, ожидается в /usr/bin/ .

В более старые UNIX-дни обычно было /usr/ смонтировано поверх NFS или несколько менее дорогостоящих носителей для экономии места на диске и затрат на рабочую станцию. /bin/ должен был иметь все необходимое для загрузки в однопользовательском режиме . Поскольку /usr/ не был установлен на надежном носителе, /bin/ включил достаточно утилит, чтобы сделать его достаточно дружественным для общего администрирования и устранения неполадок.

Сначала это было унаследовано в Linux, но поскольку дисковое пространство больше не является проблемой, и в большинстве случаев /usr/ находится в корневой файловой системе, текущая тенденция заключается в перемещении всего в /usr/bin (по крайней мере, в мире Linux). Поэтому ожидается, что большинство утилит, установленных дистрибутивом, будут найдены там. Даже самые основные утилиты, такие как cp , rm , ls т. Д. (Ну, еще нет).

Что касается выбора shebang. Традиционно это то, что администраторы или пользователи должны редактировать в соответствии с их окружением. Для всех разработчиков знает, что в чужих системах интерпретатор может быть где угодно в файловой системе (например, /usr/local/bin , /opt/gawk-4.0.1/bin ). Правильно упакованные сценарии (rpm, deb и т. Д.) Имеют либо зависимость от дистрибутива (т. Е. Интерпретатор имеет известное местоположение), либо скрипт конфигурации, который настраивает правильный хэш-элемент во время установки.

Если вам не нужно передавать аргументы в команду, тогда #!/usr/bin/env gawk – это путь, однако многие ядра (включая Linux) принимают только один аргумент для программ shebang.

В противном случае вы можете сделать программу polyglot, которая является оболочкой и скриптом awk. Вот один для awk.

 #!/bin/sh true + /; exec gawk -f "$0"; exit; / {} # awk script starts here 

Разбор синтаксиса:

  • true + /; – команда true (которая ничего не делает) с двумя инертными аргументами + и / .
  • Призыв к gawk . Это может быть любой фрагмент оболочки, который не содержит строк новой строки и где слэши написаны \/ (оболочка не против, кроме внутренних кавычек).
    Вызов использует exec для замены оболочки gawk вместо выполнения gawk в качестве подпроцесса.
  • exit; – выйти из оболочки, если gawk не найден. Все, что после этого игнорируется, за исключением того, что оно должно быть допустимым синтаксисом оболочки, если оболочка пытается разобрать всю строку до начала ее выполнения.

Анализ Awk:

  • Бит между косой чертой – это регулярное выражение.
  • true + /REGEX/ – условие. true – неопределенная переменная, поэтому ее числовое значение равно 0, но это не важно.
  • {} – Если это условие выполнено, ничего не делайте.

Предлагаемое решение Жиля действительно очень хороший подход (наконец, репутация проголосовать в его должности :)).

В любом случае, насколько я понимаю команду exec , он делает exit сразу после него ненужным, на самом деле недостижимым, поскольку процесс оболочки заменяется awk .

Кроме того, чтобы скрипт awk мог получить доступ к своим параметрам вызова, я бы предложил некоторые изменения в предлагаемом решении:

 #!/bin/sh true + /; exec -a "$0" gawk -f "$0" -- "$@"; / {} # awk script starts here 

-a "$0" позволяет скрипту иметь доступ к его имени вызова, иначе он всегда будет получать awk или gawk при доступе к переменной ARGV[0] . Аналогичным образом, "$@" позволяет сценарию получать доступ к остальным параметрам в массиве ARGV[1...N] а предыдущий позволяет сценарию получать -<something> аргументы -<something> без интерпретации их gawk для него ,

Одна вещь, которую нужно запомнить / рассмотреть, – добавить exit(0); в конце блока BEGIN { ... } awk скрипта, иначе awk будет угрожать всем параметрам, переданным скрипту в качестве входных файлов. (Обратите внимание, что это вообще не имеет никакого отношения к exit мы удалили из строки true + ... , это был недостижимый оператор оболочки, в то время как этот предлагаемый выход находится в awk-коде).

  • Лучше ли использовать строку shebang для выполнения сценария?
  • Что именно происходит, когда я запускаю файл в своей оболочке?
  • Разрешение запрета Bash Разрешено и плохой переводчик
  • Несколько аргументов в линиях shebang
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Можно ли использовать shebang для самого источника файла в текущей среде bash?
  • Всегда ли shebang совпадает с каталогом установки интерпретатора?
  • Shebang не устанавливает SHELL в cron
  • #! / bin / bash - нет такого файла или каталога
  • Шебанг: история и цель
  • Линия Shebang для «run with $ SHELL»
  • Interesting Posts

    Создайте USB-накопитель Windows 10 в Linux

    Достоинства файловой системы без разделов

    Как просматривать Flash и другие видеоролики в системах Linux?

    Возьмите вывод массива и поместите в новый массив (perl-скрипт)

    (SOLVED) Как получить текущий рабочий каталог с инвертированной косой чертой?

    Игнорировать пустые ключи в сортировке coreutils

    Повторить rsync, чтобы сохранить жесткие ссылки?

    автоматически запускать приложение

    Как создать файл устройства и имитировать поведение псевдо-устройств?

    Cygwin serial tty для высокопроизводительных COM-портов

    Добавить несколько строк, заданных как verbatim bash, после согласованной строки в файле?

    Связывание Установка в разных файловых системах

    Неожиданное падение запросов Apache

    Настроить cshrc для установки путей для определенных каналов

    Как указать требование для минимальной версии openssl в файле спецификации RPM?

    Linux и Unix - лучшая ОС в мире.