Я заметил, что некоторые программы работают по-другому, когда флаги используются перед входными параметрами, вместо того, чтобы добавлять флаги в конце. Итак, я хочу знать, каков общепринятый способ упорядочивания параметров и флагов в программе Ubuntu CLI.
Я специально спрашиваю об Ubuntu, так как это моя платформа, которая беспокоит меня. Я понимаю, что это зависит от выполняемой программы, но что является нормой?
Например:
./myprog -d file.txt
Vs
./myprog file.txt -d
Нет никакого правильного порядка, поскольку это варьируется от межпрограммного. ОС просто передает параметры командной строки программе в порядке, который им дают. Путь, которым они анализируются, зависит от программы или библиотек парсинга, которыми пользуются.
В большинстве случаев порядок не имеет значения, и общие библиотеки парсинга как getopt
или Python argparse
позволяют порядку независимый парсинг. Но другие программы могут быть более придирчивыми. Также обратите внимание, что даже с порядком независимый парсинг у Вас все еще есть зависевшие аргументы порядка. Значение некоторых опций должно быть, следуют аргументом:
ls --sort time -l
time
здесь аргумент --sort
опция и таким образом должен прибыть после него. Однако порядок --sort time
и -l
не имеет значения. Много программ позволяют писать --sort=time
для создания этого более явным, но не все делают.
проект GNU действительно имеет , стандарт кодирования для командной строки, обрабатывающей и большинство их инструментов, следует за этим, но это не что-то, от чего можно зависеть.
В случаях, где порядок действительно имеет значение, Вы обычно делаете ./myprog -d file.txt
, и это выглядит более хорошим в сценариях оболочки также. ./myprog file.txt -d
стиль записи больше для командной строки, когда Вы просто ввели вещь, и хотят добавить -d
флаг, но не курсор полностью назад к середине строки.
Насколько я видел, что нет никакой конвенции. Если Вы разрабатываете программу/сценарий Вам решать, чтобы решить, как порядок должен быть обработан. Например, find
команда выдаст предупреждение, если я помещу аргумент, связанный с каталогом после аргумента, связанного с именованием.
$ find /etc -iname "passwd" -maxdepth 1
find: warning: you have specified the -maxdepth option after a non-option argument -iname, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
/etc/passwd
Другие программы не могли бы заботиться о порядке. У меня есть простое getopts.sh
сценарий, который я сохраняю для того, когда я должен использовать параметры командной строки в другом сценарии, и он анализирует аргументы без определенного порядка
$ getopts.sh test1 -w1 test2
Hello, I'm main
The arguments are test1 -w1 test2
Конвенции POSIX и рекомендации состоят в том, что опции (вещи с-) предшествуют аргументам/операндам (все остальное). Это - самое безопасное предположение.
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02