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


21

Я знаю, что rm -f file1насильно удаляю, file1не подсказывая мне.

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

Теперь, если вы выполните rm -if file1, это также будет принудительно удалено file1без запроса меня.

Тем не менее, если вы выполните rm -fi file1, он предложит мне перед удалением file1.

Так правда ли, что при объединении опций команд последний будет иметь приоритет? как rm -if, тогда -fбудет иметь приоритет, но -fiтогда rm -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.

Давайте посмотрим, что происходит под капотом:

rmобрабатывает свой вариант getopt(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это действительно. Если последний параметр отменяет предыдущие, это зависит от самой программы. Из «Инфо РМ»

'-f' '--force' Игнорировать несуществующие файлы и пропущенные операнды и никогда не запрашивать пользователя. Игнорировать любой предыдущий параметр --interactive (-i).

'-i' Подскажите, удалять ли каждый файл. Если ответ не является положительным, файл пропускается. Игнорировать любой предыдущий параметр --force (-f). Эквивалент '--interactive = всегда'.

Как общий совет: infoобычно более подробно, чем manсамо, как правило, более подробно, чем --helpвариант.


7

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

Программисту, пишущему программу, проще всего рассматривать аргументы (флаги и другие) в строгом порядке слева направо и, возможно, выручить при попадании в какое-то затруднение. Если для обработки флагов используется библиотека (например getopt(3), существует несколько версий), то программист, по-видимому, делает то, что получается наиболее легко / естественно. Программисты - это люди, люди ленивы (или, по крайней мере, не любят думать о комбинаторном взрыве).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.