Do czego służy opcja -f dla `touch`?


23

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 -foznacza lub co robi.


2
Zakładam, że -fjako opcja jest po prostu ignorowana. Może przerobił parser argumentów i to wszystko.
Thomas

1
(ignorowane) oznacza, że ​​flaga jest ignorowana, a nie polecenie.
Pozew funduszu Moniki z

Odpowiedzi:


47

W przypadku narzędzi GNU pełna dokumentacja znajduje się na infostronie, 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 -fmiała zmusić dotyk.

Jeśli spojrzysz na źródło tych starych BSD, nie było utimes()wywołania systemowego, więc touchotworzył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 ( touchuniknąłbyś próby zrobienia tego, gdyby access(W_OK|R_OK)zwrócił wartość false ). -fpró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 touchimplementacje 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 touchnadal nie zawiedzie, jeśli przejdzie -fopcję, 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.


3
Według developer.apple.com/library/mac/documentation/Darwin/Reference/… -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! )
alephzero,

20
Korzystanie z GUI niekoniecznie jest „lepsze”. Istotą korzystania ze skryptów jest automatyzacja rzeczy, która obejmuje zapewnienie, że skrypt działa niezmodyfikowany na jak największej liczbie uniksowych dialektów, a przynajmniej na większości dialektów, które prawdopodobnie możesz napotkać, i tutaj właśnie te stare, przestarzałe problemy ze zgodnością stają się problemem .
Guntram Blohm wspiera Monikę

@alephzero To dlatego, że wersja w OS X jest wersją BSD, z którą GNU zachowuje kompatybilność.
Barmar

14

-fnic nie robi. Został zachowany dla historycznej kompatybilności ( touchzgodnie z BSD info 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 prostu breakprzełącznik przetwarzania opcji bez robienia czegokolwiek.

Jako opcja ignorowana -fjest obecna od pierwszej wersji touchpolecenia 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).


2
infostrona mówi Ignorowane; dla kompatybilności z wersjami BSD programu „touch”.
heemayl

@ heemayl Z wyjątkiem tego, że nie mogłem znaleźć BSD, który wydaje się dostarczany z argumentem „-f” do dotknięcia, więc musi być dość stary.
Chris Down,

Hmm .. Właśnie sprawdziłem instrukcję Coreutils , która mówi: „Zignorowana; dla zgodności z wersjami dotykowymi BSD.”
Pandya

3
-fjest / 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).
Runium

@sukminder Ace, dzięki! Dodam twoje informacje do odpowiedzi.
Chris Down,

12

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.


0

Patrząc na komentarz w historycznym kodzie źródłowym , wiersz 22:

  22   -f                     (ignored)\n\

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ć:

 150         case 'f':
 151           break;

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ę?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.