Порядок аргументов командной строки

Может быть, с помощью команды at ?

at -M -f $ script_name now + $ time minute

6
10.01.2017, 08:53
2 ответа

В базовых определениях POSIX есть раздел « Соглашения об утилитах », который применяется к базовым утилитам POSIX.

Стандартная утилита getopts и системный интерфейс getopt () («функция C») придерживаются рекомендаций (далее на странице, ссылка на которую приведена выше) при синтаксическом анализе команды. строка в сценарии оболочки или программе C. В частности, для getopts (в качестве примера):

Когда встречается конец параметров, утилита getopts должна выйти с возвращаемым значением больше нуля; переменная оболочки OPTIND должна быть установлена ​​на индекс первого операнда или значение «$ #» +1 , если операндов нет; переменная name должна быть установлена ​​на символ. Любое из следующего должно определять конец опций: первый аргумент - , который не является аргументом-опцией, обнаружение аргумента, который не является аргументом-опцией и не начинается с - или возникла ошибка.

По сути, это означает, что сначала должны идти параметры, а затем операнды (ваша «команда или файл»).

Выполнение этого любым другим способом сделало бы невозможным использование getopts или getopt () и, кроме того, могло бы дополнительно запутать пользователей, привыкших к POSIX-способу определения параметров и операндов для команды.

Обратите внимание, что вышеупомянутый стандарт применяется только к утилитам POSIX, но как таковой он устанавливает приоритет для утилит Unix в целом. Нестандартные утилиты Unix, очевидно, могут следовать этому правилу или нарушать его.

Например, GNU coreutils, даже несмотря на то, что они реализуют стандартные утилиты, допускает такие вещи, как

$ ls Documents/ -l

, если переменная среды POSIXLY_CORRECT не установлена, тогда как версия BSD тех же утилит не .

Это приводит к тому, что следующее работает должным образом (если вы ожидаете поведения POSIX, то есть) в системе BSD:

$ touch -- 'test' '-l'

$ ls -l test -l
-rw-r--r--  1 kk  kk  0 Jan 11 16:44 -l  
-rw-r--r--  1 kk  kk  0 Jan 11 16:44 test

Но в системе GNU coreutils вы получаете

$ ls -l test -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 test

Однако:

$ env POSIXLY_CORRECT=1 ls -l test -l

и

$ ls -l -- test -l

будет делать «правильные» вещи и в системе GNU.

8
29.04.2021, 00:05

tl; dr

пример

Все три библиотеки синтаксического анализа параметров, с которыми я работал в python default , чтобы разрешить перемежающиеся аргументы и предоставить иллюстрацию того, что является общим:

  1. Теперь устаревшая стандартная библиотека python модуль optparse позволяет:

     OptionParser.enable_interspersed_args () 
     

    Настроить синтаксический анализ, чтобы не останавливаться на первом не-параметре, позволяя перемежать переключатели с аргументами команд. Это поведение по умолчанию.

  2. Текущий модуль стандартной библиотеки Python argparse разрешает (и разрешает только) перемежающиеся аргументы.

  3. click , библиотека, которую я сейчас предпочитаю, позволяет отключить перемежающихся аргументов :

     click.Context (allow_interspersed_args = False) 
     

    Но обсуждает это возможность в расширенном разделе при устранении неполадок неизвестные аргументы подкоманд .

4
29.04.2021, 00:05

Теги

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