Какая польза от опции -f для `touch`?

23

От 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означает, или что это делает.

Pandya
источник
2
Я предполагаю, что в -fкачестве опции просто игнорируется. Может быть, исказил парсер аргументов и все тут.
Томас
1
(игнорируется) означает, что флаг игнорируется, а не команда.
Фонд Моника судебный процесс

Ответы:

47

Для утилит GNU полная документация находится на infoстранице, где вы можете прочитать:

-f
Игнорируется; для совместимости с BSD-версиями «touch».

Смотрите исторические справочные страницы BSD для прикосновения , где можно -fбыло заставить прикосновение.

Если вы посмотрите на источник этих старых BSD, utimes()системного вызова не было, поэтому touchоткройте файл в режиме чтения + записи, прочитайте один байт, выполните поиск назад и запишите его снова, чтобы обновить последний доступ и время последней модификации .

Очевидно, вам нужны были права на чтение и запись ( touchне пытайтесь сделать это, если вы access(W_OK|R_OK)вернете false ). -fпопытался обойти это путем временного изменения разрешений временно на 0666 !

0666 означает разрешение на чтение и запись для всех. Должно быть так, что в противном случае (например, с более ограничительным разрешением, таким как 0600, которое все еще разрешало бы касание ), которое могло бы означать в течение этого короткого окна, процессы, которые в противном случае имели бы разрешение на чтение или запись в файл, не могли больше ломая функционал .

Это означает, однако, что процессы, которые иначе не имели бы доступа к файлу, теперь имеют короткую возможность открыть его, нарушая безопасность .

Это не очень разумно. Современные touchреализации этого не делают. С тех пор был введен utime()системный вызов , позволяющий изменять время модификации и доступа отдельно, без необходимости смешиваться с содержимым файлов (что означает, что он также работает с нестандартными файлами), и для этого требуется только доступ для записи.

GNU по- touchпрежнему не завершается ошибкой, если передается -fопция, а просто игнорирует флаг. Таким образом, сценарии, написанные для этих старых версий BSD, не перестают работать при переносе в системы GNU. Не очень актуально в наше время.

Стефан Шазелас
источник
3
Согласно developer.apple.com/library/mac/documentation/Darwin/Reference/… -f все еще функционирует в Mac OS X. (Но, без сомнения, существует по меньшей мере 57 различных способов выполнения той же функциональности «лучше» с использованием графического интерфейса пользователя! )
alephzero
20
Использование GUI не обязательно "лучше". Смысл использования сценариев - автоматизировать работу, которая включает в себя обеспечение того, чтобы ваш сценарий выполнялся без изменений на максимально возможном количестве юникси-диалектов или, по крайней мере, на большинстве диалектов, с которыми вы, вероятно, столкнетесь, и именно здесь эти старые устаревшие проблемы совместимости становятся проблемой ,
Гунтрам Блом поддерживает Монику
@alephzero Это потому, что версия в OS X является версией BSD, с которой GNU поддерживает совместимость.
Бармар
14

-fничего не делает. Он сохранен для исторической совместимости ( touchсогласно BSD info touch), поэтому приложения, ожидающие его существования, не пропускают его и возвращают сообщение об ошибке, в котором говорится, что его не существует. Предполагая, что это GNU coreutils, вы можете увидеть в источнике, что это просто делает breakпереключение обработки опций без каких-либо действий.

В качестве игнорируемой опции, -fприсутствует в самой первой версии команды GNU, touchдобавленной в 1992 году ( см. Diff ). Похоже, что, по крайней мере в FreeBSD v9, -f«попытайтесь [s] принудительно обновить обновление, даже если права доступа к файлам в настоящее время не разрешают его» (как обнаружил Sukminder, спасибо).

Крис Даун
источник
2
infoстраница говорит, что игнорируется; для совместимости с BSD-версиями «touch».
Heemayl
@heemayl За исключением того, что я не смог найти BSD, который, кажется, поставляется с аргументом "-f", поэтому он должен быть довольно старым.
Крис Даун
Хм ... Я только что проверил руководство Coreutils , которое гласит: "Игнорируется; для совместимости с BSD-версиями touch."
Pandya
3
-fis / использовался для попытки принудительного обновления, даже если права доступа к файлам разрешали его в BSD. Не в V10, но в v9: freebsd.org/cgi/… (по крайней мере, из FreeBSD).
Runium
@sukminder Эйс, спасибо! Я добавлю вашу информацию в ответ.
Крис Даун
12

Всякий раз, когда вы видите «опция X игнорируется» в выводе --help или на man-странице, это означает: программа принимает опцию X - вы не получаете синтаксическую ошибку - но она не оказывает никакого влияния. Программа делает то же самое, что и при отсутствии опции.

Как показывают другие ответы, это сделано для обратной совместимости. Опция, которая раньше давала некоторый эффект, что бы она ни делала, больше не нужна, и выполнение одной и той же вещи независимо от опции - это правильное поведение совместимости.

zwol
источник
0

При просмотре комментария в историческом исходном коде строка 22:

  22   -f                     (ignored)\n\

параметр -f должен был игнорироваться с момента первого выпуска Джима Мейринга.

И оператор switch для обработки опций имеет явный случай (строки 150/151), который ничего не делает:

 150         case 'f':
 151           break;

Примечательно, что с 1992 года мотивировали следующих авторов игнорировать эту опцию. Может быть, есть сценарий использования, который требует параметр -f и в противном случае прерывается?

Мы видим
источник