13

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

gcc -O hello.c -c

Или же

gcc hello.c -c -O

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

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

4 ответа4

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 .

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

4

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

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

4

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .