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

4294
bobo

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

gcc -O hello.c -c 

Или же

gcc hello.c -c -O 

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

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

13

4 ответа на вопрос

18
DK.

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

Набор опций 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
Dan McGrath

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

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

4
Jonathan Leffler

Есть случаи, когда порядок параметров командной строки имеет значение даже в 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
Johan

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

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

Итак, если мы посмотрим на команду 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 ++`? Royi 6 лет назад 0

Похожие вопросы