Имеет ли значение порядок параметров команды в Linux?

14

Например, когда я ввел либо:

gcc -O hello.c -c

Или

gcc hello.c -c -O

Оба не жаловались.

Имеет ли значение порядок параметров команды?

бобо
источник

Ответы:

18

Это зависит от самой программы; операционная система не определяет, имеет ли значение порядок.

Набор опций GCC настолько колоссален, что я не могу сказать с какой-либо достоверностью, можете ли вы предоставить любую опцию в произвольном порядке; вам придется прочитать документацию для этого варианта. Тем не менее, общее практическое правило заключается в том, что если у вас есть два или более взаимоисключающих варианта (например, -O1 -O2для разных уровней оптимизации), программы обычно выбирают более поздние варианты, чем более ранние. Опять же, это не обеспечивается Linux.

Простая программа, которая позволяет вам указать большинство параметров в любом порядке ls. Вывести список всех файлов в текущем каталоге с подробностями можно с помощью либо ls -la, ls -alлибо ls -l -a. Однако ls -l1 (то есть 'el' 'one') не дает такой же вывод, как ls -1l ('one' 'l'). Это взаимоисключающие опции, и последний из перечисленных выше едет первым.

Существует также странная программа, которая применяет параметры к аргументам по мере их поступления. Так, например, вы можете иметь гипотетический команду , blah -a 1 2 -b 3где -aприменяется ко всем трем аргументам, но -bотносится только к 3.

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

DK.
источник
5

В некоторых случаях порядок параметров командной строки имеет значение даже в GCC. Если вы связываете со статическими библиотеками (.a), то, если вы укажете -llib1 -llib2и есть функция, liblib2.aкоторая вызывает функцию, liblib1.aкоторая не была введена в программу, то ссылка потерпит неудачу с неразрешенным символом. С общими библиотеками это не проблема.

В общем, как говорили другие, порядок опций может иметь или не иметь значения. Однако выходные данные двух приведенных ниже команд различны - поэтому порядок аргументов для catизменения выходных данных:

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

Также обратите внимание, что в Linux (в частности) GNU getopt()склонен переупорядочивать командную строку, чтобы все параметры (начиная с минуса) обрабатывались перед любым другим аргументом - если только вы не используете двойную черту, --чтобы отметить конец аргументы, или если вы не установите переменную среды POSIXLY_CORRECT.

Джонатан Леффлер
источник
4

Только если у вас есть 2 варианта, которые являются взаимоисключающими. В противном случае порядок не имеет значения.

Конечно, это может варьироваться в зависимости от того, как написана программа, но должно применяться ко всем обычным инструментам * nix.

Дэн МакГрат
источник
3

Трудно понять, как другие уже говорили вам, это может иметь значение (или нет).

Хорошее практическое правило - открыть страницу справочника, посмотреть на первый пример и использовать этот порядок при размещении аргумента там.

Итак, если мы посмотрим на команду cat (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

Кажется, пока все параметры находятся перед аргументами файла, все будет в порядке.

И если мы посмотрим на зверя gcc (man gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

Это не так просто понять, как команда cat :)

Но если вы хотите быть осторожнее, -c, кажется, предшествует -O, а затем infile (hello.c) кажется последним.

gcc -c -O hello.c

Но, как вы уже знаете, так как другие работают ... это очень безопасно :)

Johan
источник
Как насчет связывания флагов -static-libstdc++?
Рой