Для утилит 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. Не очень актуально в наше время.
-f
качестве опции просто игнорируется. Может быть, исказил парсер аргументов и все тут.