W przypadku narzędzi GNU pełna dokumentacja znajduje się na info
stronie, na której można przeczytać:
-f
Ignorowane; dla kompatybilności z wersjami BSD programu „touch”.
Zobacz historyczne BSD stron podręcznika dla dotyku , gdzie -f
miała zmusić dotyk.
Jeśli spojrzysz na źródło tych starych BSD, nie było utimes()
wywołania systemowego, więc touch
otworzyłby plik w trybie odczytu + zapisu, odczytał jeden bajt, szukał wstecz i zapisał go ponownie, aby zaktualizować czas ostatniego dostępu i ostatniej modyfikacji .
Oczywiście potrzebujesz zarówno uprawnień do odczytu, jak i zapisu ( touch
uniknąłbyś próby zrobienia tego, gdyby access(W_OK|R_OK)
zwrócił wartość false ). -f
próbowałem obejść ten problem, tymczasowo zmieniając uprawnienia na 0666 !
0666 oznacza odczyt i zapis dla wszystkich. Musiało być tak, że w przeciwnym razie (jak przy bardziej restrykcyjnym uprawnieniu, takim jak 0600, które nadal pozwalałoby na dotyk ), co mogłoby oznaczać podczas tego krótkiego okna, procesy, które w innym przypadku miałyby uprawnienia do odczytu lub zapisu do pliku, nie mogłyby już , przełamując funkcjonalność .
Oznacza to jednak, że procesy, które w innym przypadku nie miałyby dostępu do pliku, mają teraz krótką możliwość jego otwarcia, co narusza bezpieczeństwo .
To nie jest zbyt rozsądne. Nowoczesne touch
implementacje tego nie robią. Od tego czasu wprowadzono utime()
wywołanie systemowe , które umożliwia osobną zmianę czasu modyfikacji i dostępu bez konieczności mieszania się z zawartością plików (co oznacza, że działa również z plikami nieregularnymi) i do tego wymaga jedynie dostępu do zapisu.
GNU touch
nadal nie zawiedzie, jeśli przejdzie -f
opcję, ale po prostu ignoruje flagę. W ten sposób skrypty napisane dla starych wersji BSD nie zawiodą po przeniesieniu do systemów GNU. Obecnie niewiele znaczące.
-f
jako opcja jest po prostu ignorowana. Może przerobił parser argumentów i to wszystko.