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