Распределение сценария: я должен использовать/bin/gawk или/usr/bin/gawk для хижины?

От ssh_config(5) страница справочника:

 Host    Restricts the following declarations (up to the next Host key‐
         word) to be only for those hosts that match one of the patterns
         given after the keyword.  If more than one pattern is provided,
         they should be separated by whitespace.

...

 HostName
         Specifies the real host name to log into.  This can be used to
         specify nicknames or abbreviations for hosts.  If the hostname
         contains the character sequence ‘%h’, then this will be replaced
         with the host name specified on the commandline (this is useful
         for manipulating unqualified names).

Так:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
12
22.10.2013, 22:37
4 ответа

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

таращите глаза и большинство утилит, которые идут с ОС, как, ожидают, будут в /usr/bin/.

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

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

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

7
27.01.2020, 19:54

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

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

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

Парсинг Shell:

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

Парсинг Awk:

  • Бит между наклонными чертами является регулярным выражением.
  • true + /REGEX/ — условие. true неопределенная переменная, таким образом, ее числовое значение 0, не, что она имеет значение.
  • {} — Если упомянутое условие содержит, ничего не сделайте.
14
27.01.2020, 19:54

Предлагаемое решение Gilles является очень хорошим подходом (наконец-то возникнет репутация голосовать в его посте :)).

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

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

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

- «$ 0» Позволяет скрипту иметь доступ к его названию вызова, в противном случае он всегда будет получать awk или Gawk при доступе к переменной ARGV [0] . Аналогично, «$ @» позволяет скрипту получить доступ к оставшимся параметрам в массиве [1 ... N] , а также - , предшествующий ему Позволяет скрипту получить - <Что-то> аргументы без Gawk интерпретации их предназначены для него.

Одно, чтобы помнить / рассмотреть вопрос, это добавить выход (0); Заявление в конце начинается {...} Блок awk Программа скрипта, в противном случае awk будет угрожать все параметры, переданные скрипту в качестве входных файлов. (Обратите внимание, что это не имеет ничего общего, вообще, с выходом , которое мы удалили из строки True + ... , это было недопущенное оператор оболочки, когда этот предложенный выезд находится в коде AWK).

5
27.01.2020, 19:54

Если установлены более современные coreutils (IIUC 8.30+ ), теперь вы можете использовать

#!/usr/bin/env -S gawk -f

Все параметры будут переданы env как один аргумент, и он их разделит

1
25.05.2020, 02:30

Теги

Похожие вопросы