От man touch
:
-f (ignored)
Но я не понимаю, что значит игнорировать .
Я попробовал следующее:
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file
$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file
И заметил, что это меняет временные метки, несмотря на -f
.
Итак, я хочу знать, что -f
означает, или что это делает.
-f
качестве опции просто игнорируется. Может быть, исказил парсер аргументов и все тут.Ответы:
Для утилит GNU полная документация находится на
info
странице, где вы можете прочитать:Смотрите исторические справочные страницы BSD для прикосновения , где можно
-f
было заставить прикосновение.Если вы посмотрите на источник этих старых BSD,
utimes()
системного вызова не было, поэтомуtouch
откройте файл в режиме чтения + записи, прочитайте один байт, выполните поиск назад и запишите его снова, чтобы обновить последний доступ и время последней модификации .Очевидно, вам нужны были права на чтение и запись (
touch
не пытайтесь сделать это, если выaccess(W_OK|R_OK)
вернете false ).-f
попытался обойти это путем временного изменения разрешений временно на 0666 !0666 означает разрешение на чтение и запись для всех. Должно быть так, что в противном случае (например, с более ограничительным разрешением, таким как 0600, которое все еще разрешало бы касание ), которое могло бы означать в течение этого короткого окна, процессы, которые в противном случае имели бы разрешение на чтение или запись в файл, не могли больше ломая функционал .
Это означает, однако, что процессы, которые иначе не имели бы доступа к файлу, теперь имеют короткую возможность открыть его, нарушая безопасность .
Это не очень разумно. Современные
touch
реализации этого не делают. С тех пор был введенutime()
системный вызов , позволяющий изменять время модификации и доступа отдельно, без необходимости смешиваться с содержимым файлов (что означает, что он также работает с нестандартными файлами), и для этого требуется только доступ для записи.GNU по-
touch
прежнему не завершается ошибкой, если передается-f
опция, а просто игнорирует флаг. Таким образом, сценарии, написанные для этих старых версий BSD, не перестают работать при переносе в системы GNU. Не очень актуально в наше время.источник
-f
все еще функционирует в Mac OS X. (Но, без сомнения, существует по меньшей мере 57 различных способов выполнения той же функциональности «лучше» с использованием графического интерфейса пользователя! )-f
ничего не делает. Он сохранен для исторической совместимости (touch
согласно BSDinfo touch
), поэтому приложения, ожидающие его существования, не пропускают его и возвращают сообщение об ошибке, в котором говорится, что его не существует. Предполагая, что это GNU coreutils, вы можете увидеть в источнике, что это просто делаетbreak
переключение обработки опций без каких-либо действий.В качестве игнорируемой опции,
-f
присутствует в самой первой версии команды GNU,touch
добавленной в 1992 году ( см. Diff ). Похоже, что, по крайней мере в FreeBSD v9,-f
«попытайтесь [s] принудительно обновить обновление, даже если права доступа к файлам в настоящее время не разрешают его» (как обнаружил Sukminder, спасибо).источник
info
страница говорит, что игнорируется; для совместимости с BSD-версиями «touch».-f
is / использовался для попытки принудительного обновления, даже если права доступа к файлам разрешали его в BSD. Не в V10, но в v9: freebsd.org/cgi/… (по крайней мере, из FreeBSD).Всякий раз, когда вы видите «опция X игнорируется» в выводе --help или на man-странице, это означает: программа принимает опцию X - вы не получаете синтаксическую ошибку - но она не оказывает никакого влияния. Программа делает то же самое, что и при отсутствии опции.
Как показывают другие ответы, это сделано для обратной совместимости. Опция, которая раньше давала некоторый эффект, что бы она ни делала, больше не нужна, и выполнение одной и той же вещи независимо от опции - это правильное поведение совместимости.
источник
При просмотре комментария в историческом исходном коде строка 22:
параметр -f должен был игнорироваться с момента первого выпуска Джима Мейринга.
И оператор switch для обработки опций имеет явный случай (строки 150/151), который ничего не делает:
Примечательно, что с 1992 года мотивировали следующих авторов игнорировать эту опцию. Может быть, есть сценарий использования, который требует параметр -f и в противном случае прерывается?
источник