Пріоритет параметрів команд?


21

Я знаю, що це rm -f file1буде примусово видаляти, file1не вимагаючи мене.

Я також знаю, що rm -i file1спочатку підкаже мене перед видаленнямfile1

Тепер, якщо ви виконаєте rm -if file1, це також буде примусово видалено, file1не вимагаючи мене.

Однак якщо ви виконаєте rm -fi file1, воно підкаже мені перед видаленням file1.

То чи правда, що при поєднанні параметрів команд останній буде мати перевагу? як rm -if, то -fбуде мати перевагу, але rm -fiтоді -iволя буде мати перевагу.

lsКоманди, наприклад, це не має значення , якщо ви сказали , ls -latRчи ls -Rtal.

Тож я здогадуюсь, це має значення лише тоді, коли у вас є суперечливі варіанти команд на кшталт rm -if, це правильно?


Відповіді:


23

При використанні rmобох -iі -f параметрів перший буде ігнорований. Це задокументовано в стандарті POSIX :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

а також на infoсторінці GNU :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

Подивимося, що відбувається під кришкою:

rmgetopt(3)конкретно обробляє свій варіант getopt_long. Ця функція буде обробляти параметри параметрів у командному рядку ( **argv) у порядку появи:

Якщо getopt () викликається неодноразово, він повертає послідовно кожен із символів опції з кожного з елементів параметра.

Ця функція зазвичай викликається в циклі, поки всі параметри не будуть оброблені. З точки зору цієї функції параметри обробляються в порядку. Те, що насправді відбувається, залежить від програми, оскільки логіка програми може вибрати для виявлення суперечливих варіантів, їх переопрацювання або помилки. Для випадку rmі iі fопцій, вони прекрасно перезапис один одного. Від rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

Обидва параметри встановлюють однакові змінні, і стан цих змінних буде залежно від того, який варіант буде останній у командному рядку. Ефект цього відповідає стандарту POSIX та rmдокументації.


3
Більшість команд обробляють свої аргументи в порядку, або помилка в конфліктах, або приймають останні налаштування (як rm). Я думаю, що рідко команда коли-небудь приймає перше налаштування параметра та ігнорує аргументи, які б змінили вже встановлений варіант.
Пітер Кордес

7

Так, для rmцього справедливо. Якщо останній варіант замінює попередній, проте залежить від самої програми. Від'info rm '

'-f' '--force' Ігноруйте неіснуючі файли та відсутні операнди і ніколи не підказуйте користувача. Ігноруйте будь-який попередній варіант - - інтерактивний '(' -i ').

'-i' Запрошення видаляти кожен файл. Якщо відповідь не є позитивною, файл пропускається. Ігноруйте будь-який попередній варіант '--force' ('-f'). Еквівалентно '--інтерактивний = завжди'.

Як загальний натяк: infoзазвичай це більш детально, ніж man, що саме по собі зазвичай більш детально, ніж --helpваріант.


7

Не існує «пріоритету» для прапорів, кожна програма обробляє їх так, як хоче. Більшість докладають зусиль, щоб зібрати всі прапори та перевірити на конфлікти, для стандартних інструментів (наприклад, на які посилаються rm(1)) відповідні стандарти можуть щось наказувати (але потім, знову ж таки, ваша конкретна версія може бути неохайною при інтерпретації кутових справ стандарту / не проходити спеціально перевірку для них).

Для програміста, який пише програму, найпростіше розглядати аргументи (прапори та інші) в суворому порядку зліва направо, і, можливо, під заставу під час удару в якийсь корч. Якщо використовується бібліотека для обробки прапорів (наприклад getopt(3), існує кілька версій, що плавають навколо), програміст, імовірно, робить те, що стає найпростішим / природним. Програмісти - це люди, люди ледачі (або принаймні не люблять думати через комбінаторний вибух).

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