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

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

3 Solutions collect form web for “Приоритет параметров команды?”

При использовании 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) , есть несколько версий, плавающих вокруг), программист, по-видимому, делает то, что становится самым простым / естественным. Программисты – это люди, люди ленивы (или, по крайней мере, не любят думать через комбинаторный взрыв).

  • Как вызвать скрипт с шаблоном подстановки и еще два аргумента?
  • POSIX и Bash, sh shorthand, для составного оператора if
  • Как выполнять последовательные команды из истории?
  • Как напечатать «$» в документе здесь
  • Как добавить данные о подключении к сети или пользователям в записи истории?
  • Невозможно остановить bash, чтобы развернуть звезду (символ подстановки), переданный в приложение из shellscript
  • Неправильный ли раздел синопсиса справочной страницы для команды find?
  • Как скобки интерпретируются в командной строке?
  • Как вставить кавычки в командах bash
  • Найдите слово в предложении с Bourne Shell (sh)
  • Как я могу использовать vi для редактирования строки подсказки утилиты?
  • Interesting Posts

    Редактирование вывода команды как новой команды

    Вывести поле ls -l с цифрами, сгруппированными по тысячам?

    Как обновить / понизить определенный пакет с «sid» на debian jessie «stable»?

    Почему 2 периферийных устройства bluetooth не мешают? (мышь и клавиатура)

    Shell Script: для извлечения части строки из файла после того, как найдено совпадение

    отправить нажатие клавиши для обработки

    временный файл репликации zfs

    Как настроить сетевой принтер (DE-agnostic решение)

    Как блокировать эхо-запросы icmp из подсети

    поиск местоположения значка запуска X приложения

    qemu guest обходит межсетевой экран хоста

    Каков самый простой способ создания двоичного RPM из проверки исходного кода с помощью файла .spec

    i3 запустить dmenu в разных режимах для каждой рабочей области

    Настройка раскладки клавиатуры: трехпозиционный переключатель, 3-й макет, когда CapsLock включен

    bash эквивалент zsh $ @

    Linux и Unix - лучшая ОС в мире.