Например, когда я ввел либо:
gcc -O hello.c -c
Или
gcc hello.c -c -O
Оба не жаловались.
Имеет ли значение порядок параметров команды?
Например, когда я ввел либо:
gcc -O hello.c -c
Или
gcc hello.c -c -O
Оба не жаловались.
Имеет ли значение порядок параметров команды?
Это зависит от самой программы; операционная система не определяет, имеет ли значение порядок.
Набор опций 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
.
Опять же, это зависит от конкретной программы. Если вы когда-либо не уверены, прочитайте документацию.
В некоторых случаях порядок параметров командной строки имеет значение даже в GCC. Если вы связываете со статическими библиотеками (.a), то, если вы укажете -llib1 -llib2
и есть функция, liblib2.a
которая вызывает функцию, liblib1.a
которая не была введена в программу, то ссылка потерпит неудачу с неразрешенным символом. С общими библиотеками это не проблема.
В общем, как говорили другие, порядок опций может иметь или не иметь значения. Однако выходные данные двух приведенных ниже команд различны - поэтому порядок аргументов для cat
изменения выходных данных:
cat /etc/passwd /etc/group
cat /etc/group /etc/passwd
Также обратите внимание, что в Linux (в частности) GNU getopt()
склонен переупорядочивать командную строку, чтобы все параметры (начиная с минуса) обрабатывались перед любым другим аргументом - если только вы не используете двойную черту, --
чтобы отметить конец аргументы, или если вы не установите переменную среды POSIXLY_CORRECT.
Только если у вас есть 2 варианта, которые являются взаимоисключающими. В противном случае порядок не имеет значения.
Конечно, это может варьироваться в зависимости от того, как написана программа, но должно применяться ко всем обычным инструментам * nix.
Трудно понять, как другие уже говорили вам, это может иметь значение (или нет).
Хорошее практическое правило - открыть страницу справочника, посмотреть на первый пример и использовать этот порядок при размещении аргумента там.
Итак, если мы посмотрим на команду 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
Но, как вы уже знаете, так как другие работают ... это очень безопасно :)
-static-libstdc++
?