Чи має значення порядок параметрів команд у Linux?


15

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

gcc -O hello.c -c

Або

gcc hello.c -c -O

Обидва не скаржилися.

Чи має значення параметр команд?

Відповіді:


19

Це залежить від самої програми; Операційна система не диктує, чи потрібно замовляти питання.

Набір варіантів 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.

Знову ж таки, це залежить від конкретної програми. Якщо ви колись не впевнені, прочитайте документацію.


BTW, ls -al path/to/dirдійсна, але ls path/to/dir -alні. Отже ls, ви повинні поставити свої параметри перед (необов'язковою) каталогом, вміст якої ви хочете перерахувати.
jvriesem

6

Бувають випадки, коли порядок параметрів командного рядка має значення навіть у 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

Тільки якщо у вас є два варіанти, які взаємовиключні. Інакше замовлення не має значення.

Звичайно, це може змінюватися залежно від того, як програма була написана, але має застосовуватися до всіх звичайних інструментів * nix.


3

Важко знати, як вже говорили інші, це може змінити (чи ні).

Добрим правилом є відкриття сторінки man і перегляд першого прикладу та використання цього порядку при введенні аргументу.

Отже, якщо ми подивимось на команду кота (людина кішка):

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.

Це не так просто зрозуміти як команда кішки :)

Але якщо ви хочете зіграти його безпечно, -c, здається, виходить раніше -O, а потім інфілювати (hello.c), здається, останнім.

gcc -c -O hello.c

Але, як ви вже знаєте, оскільки інші працюють ... це грає дуже безпечно :)


А як щодо зв’язування прапорів -static-libstdc++?
Рой
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.