Od man touch
:
-f (ignored)
Ale nie rozumiem, co należy rozumieć przez ignorowanie .
Próbowałem następujące:
$ 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
Zauważyłem, że mimo to zmienia znaczniki czasu -f
.
Więc chcę wiedzieć, co -f
oznacza lub co robi.
-f
jako opcja jest po prostu ignorowana. Może przerobił parser argumentów i to wszystko.Odpowiedzi:
W przypadku narzędzi GNU pełna dokumentacja znajduje się na
info
stronie, na której można przeczytać: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ęctouch
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, gdybyaccess(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 wprowadzonoutime()
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.źródło
-f
nadal działa w Mac OS X. (Bez wątpienia istnieje co najmniej 57 różnych sposobów „lepszej” realizacji tej samej funkcji przy użyciu GUI! )-f
nic nie robi. Został zachowany dla historycznej kompatybilności (touch
zgodnie z BSDinfo touch
), dzięki czemu aplikacje, które oczekują, że istnieje, nie przechodzą i otrzymują komunikat o błędzie informujący, że nie istnieje. Zakładając, że jest to coreutils GNU, możesz zobaczyć w źródle, że robi to po prostubreak
przełącznik przetwarzania opcji bez robienia czegokolwiek.Jako opcja ignorowana
-f
jest obecna od pierwszej wersjitouch
polecenia GNU dodanej w 1992 roku ( patrz diff ). Wydaje się, że przynajmniej w FreeBSD v9-f
„próbuje wymusić aktualizację, nawet jeśli uprawnienia do plików na to obecnie nie pozwalają” (jak stwierdził Sukminder, dzięki).źródło
info
strona mówi Ignorowane; dla kompatybilności z wersjami BSD programu „touch”.-f
jest / został użyty do próby wymuszenia aktualizacji, nawet jeśli uprawnienia do plików pozwoliły na BSD. Nie w wersji 10, ale w wersji 9: freebsd.org/cgi/… (przynajmniej FreeBSD).Ilekroć widzisz „opcja X jest ignorowana” na wyjściu --help lub na stronie podręcznika, oznacza to: program akceptuje opcję X - nie pojawia się błąd składni - ale nie ma żadnego efektu. Program robi to samo, co zrobiłby w przypadku braku opcji.
Jak pokazują inne odpowiedzi, ma to na celu zapewnienie zgodności z poprzednimi wersjami. Opcja używana mieć pewien wpływ, cokolwiek to miało miejsce nie jest już użyteczne, a robi to samo, niezależnie od opcji jest prawo zachowania kompatybilności.
źródło
Patrząc na komentarz w historycznym kodzie źródłowym , wiersz 22:
opcja -f miała być ignorowana od pierwszego wydania Jima Meyeringa.
A instrukcja switch do obsługi opcji ma wyraźny przypadek (linie 150/151), aby nic nie robić:
Niezwykłe było to, co motywowało następujących autorów od 1992 roku do zignorowania tej opcji. Może istnieje scenariusz użycia, który wymaga opcji -f i w inny sposób psuje się?
źródło