Руководство GNU Coreutils дляmv
говорит:
-f --force Do not prompt the user before removing a destination file.
Тем не менее, это, кажется, уже поведение по умолчанию для mv
, так что -f
опция представляется излишней. Например, в GNU Bash версии 4.3.11:
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Кажется маловероятным, что целью -f
флага является переопределение alias mv="mv -i"
, потому что есть несколько стандартных способов переопределения псевдонима (например, использование \mv
), которые бы делали это более кратко и согласованно для всех команд.
В руководстве отмечается, что «если вы укажете более одной из опций -i, -f, -n, вступит в силу только последний вариант», но все же кажется маловероятным, что цель -f
флага - переопределить -i
флаг в целом, потому что эквивалентное поведение может быть достигнуто простым использованием mv
, что гораздо более кратко и понятно, чем использование mv -if
.
В таком случае, какова цель -f
флага? Почему это существует?
mount
, например (хотя есть лучшие примеры). Вы действительно хотите запомнить, какие настройки по умолчанию для каждой опции, чтобы вы могли определить, какие опции вам нужно установить? ХОРОШО иметь опции как по умолчанию, так и не по умолчанию, так что вы можете явно установить опцию вместо того, чтобы мысленно отслеживать, что по умолчанию. Что-то там легче запомнить, чем что-то не там .Ответы:
Использование
-f
более четко описанные в странице человека от 4BSD, который был где-f
и-i
были добавлены опции:Еще более точное определение того, как работает mv, дано в стандарте POSIX , который добавляет, что
-f
переопределяет , только-i
если это происходит позже в командной строке.Таким образом, поведение по умолчанию немного отличается от
-f
. По умолчанию запрашивается подтверждение только тогда, когда цель недоступна для записи. (Это поведение восходит, по крайней мере, до V4 , гдеmv
не было никаких опций.) Если-i
опция указана, mv дополнительно будет запрашивать подтверждение всякий раз, когда цель существует.-f
Вариант будет препятствовать задавать в обоих случаях , (если это происходит после любого-i
).источник
-f
флаг использовался, даже если он не использовался .isatty(0)
). Кроме того, хотя это правда, что позднее-f
переопределяет-i
, это не может означать, что это то же самое, что без аргументов.Это полезно, если установить выполнение
mv
в разумное значение по умолчанию:Когда вы захотите форсировать ход, это сработает:
Так как это последняя опция в расширенной команде, которая имеет значение:
Этот момент также упоминается в руководстве по GNU Coreutils .
источник
alias mv="mv -i"
является причиной существования-f
.mv(1)
(и другие команды Unix) как «безумное», как ты понимаешь ...-i
, я считаю, что любой, кто использовал командную строку более нескольких лет, был сожженmv
в тот или иной момент.Существует потому что (
man mv
)Таким образом, вы можете иметь скрипт / псевдоним / функцию, который всегда запрашивает, но вы все равно можете переопределить эту опцию.
Разумеется, значимая функция / скрипт будет делать что-то большее (например, регистрировать действие).
источник
alias mv="mv -i"
является причиной существования-f
. Вы упоминаете также скрипты и функции. Пожалуйста, не могли бы вы привести примеры с использованием этих двух?mv -f
, поэтому мне до сих пор неясно, как они оправдывают / объясняют его существование. Извините, если я упускаю очевидное!mv -i
. Если вы хотите использовать их, но пропустите взаимодействие, вы бы использовалиMV -f
и т. Д.mv
без какой-либо из этих опций заключается в том, чтобы иногда спрашивать (цель не доступна для записи и интерактивный терминал), так что это будет явной разницей междуmv -f
и\mv
.mv
Команда по своей функции может по- разному с-f
опцией, в том , что он будет пытаться перезаписи защищенных записей файлов без запроса.Из-за разрешений на запись в каталог user2 может перезаписывать файлы user1
./dir/
, но перед этим будет предупрежден.-f
предотвращает предупреждение.источник
В программировании оболочки использование -f является распространенной идиомой, используемой для того, чтобы убедиться, что ваши команды не прерываются с ошибками, или запрашивать у сценария / пользователя интерактивный ответ при выполнении определенных команд. Последнее, что вам нужно, - это чтобы ваш скрипт приостановил ожидание пользовательского ввода или, что еще хуже, неправильную команду, чтобы получить ввод из стандартного входа.
Примечание: удаление псевдонима может вызвать / удалить побочные эффекты. Если вы добавили псевдоним команды в другую версию или с дополнительными опциями, отмена псевдонима вызовет нежелательные побочные эффекты. Например, вы можете настроить псевдоним с помощью mv и rm для использования корзины (или других систем защиты / отслеживания). Отмена псевдонима сломает это ...
источник
-f
опция для cp или mv не гарантирует, что «они работают». Например, если разрешения недостаточно, команда -f не заставит его работать. Вы имели в виду, что -f вызывает перезапись без запроса. Противоположный флаг -i означает, что при перезаписи требуется интерактив.isatty(0)
), поэтому, например, если ваш скрипт выполняется как часть канала, он не будет запущен. 2.) Добавление-f
это не то же самое, что удаление,-i
потому чтоmv -i -f
отличается отmv
, см . Ответ Марка .