Intereting Posts
Не удалось обновить CentOS6.6 из-за 404 Как назначить несколько фиксированных IP-адресов для одного домена? Как удалить имя из фамилии, когда длина неизвестна? Список всех файлов, содержащих определенную строку. Проблема с разрешениями пользователей в CentOS 7: «Разрешение отказано» Как заменить литерал \ n символом новой строки? (на OS X) Найти дубликаты по столбцу в файле Пополнение Git для псевдонимов доступно только после запуска `git reflog` Система отказывается от SSH и зацикливается на «загрузке» после установки systemd Почему у меня нет подключения к сети на моей виртуальной машине? Сбой QWin: невозможно создать контекст платформы OpenGL, ни GLX, ни EGL не включены Команда для печати использования ЦП / ОЗУ в течение продолжительности другой команды / сценария udisks2: разрешение отклонено Выполняет ли git после инициализации удаление необработанных файлов? Может ли vim редактировать удаленный файл с правами root?

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

Я знаю, что 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 , это правильно?

При использовании 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 .

Да, для rm это действительно. Если последний параметр переопределяет предыдущие, он зависит только от самой отдельной программы. От'info rm '

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

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

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

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

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