Qual è l'uso dell'opzione -f per `touch`?


23

Da man touch:

-f     (ignored)

Ma non capisco cosa si intende per ignorato .

Ho provato a seguire:

$ 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

E ho notato che cambia i timestamp nonostante -f.

Quindi, voglio sapere cosa -frappresenta o cosa fa.


2
Presumo che -fl'opzione sia appena ignorata. Forse ha rovinato l'argomento parser e basta.
Thomas

1
(ignorato) significa che il flag è ignorato, non il comando.
Finanzia la causa di Monica il

Risposte:


47

Per le utility GNU, la documentazione completa si trova nella infopagina, dove è possibile leggere:

-f
ignorato; per compatibilità con le versioni BSD di `touch '.

Vedi le pagine man storiche di BSD per il tocco , dove -fdoveva forzare il tocco.

Se si guarda alla fonte di quei vecchi BSD, non c'era nessuna utimes()chiamata di sistema, quindi touchsi apriva il file in modalità lettura + scrittura, si leggeva un byte, si cercava di nuovo e si riscriveva in modo da aggiornare l'ultimo accesso e l'ora dell'ultima modifica .

Ovviamente, avevi bisogno delle autorizzazioni di lettura e scrittura ( toucheviterei di provare a farlo se access(W_OK|R_OK)restituito falso ). -fha cercato di aggirare il problema modificando temporaneamente le autorizzazioni temporaneamente su 0666 !

0666 significa permesso di leggere e scrivere a tutti. Doveva essere altrimenti (come con un'autorizzazione più restrittiva come 0600 che avrebbe comunque permesso il tocco ) che poteva significare durante quella breve finestra, i processi che altrimenti avrebbero letto o scritto l'autorizzazione al file non potevano più , funzionalità di rottura .

Ciò significa tuttavia che i processi che altrimenti non avrebbero accesso al file ora hanno una breve opportunità per aprirlo, rompendo la sicurezza .

Non è una cosa molto ragionevole da fare. Le touchimplementazioni moderne non lo fanno. Da allora è stata introdotta la utime()chiamata di sistema , che consente di modificare le modifiche e il tempo di accesso separatamente senza dover mescolarsi con il contenuto dei file (il che significa che funziona anche con file non regolari) e necessita solo dell'accesso in scrittura per quello.

GNU touchcontinua a non fallire se viene passata l' -fopzione, ma ignora semplicemente la bandiera. In questo modo, gli script scritti per quelle vecchie versioni di BSD non falliscono quando vengono portati su sistemi GNU. Al giorno d'oggi non molto rilevante.


3
Secondo developer.apple.com/library/mac/documentation/Darwin/Reference/… -f funziona ancora in Mac OS X. (Ma senza dubbio ci sono almeno 57 modi diversi di eseguire la stessa funzionalità "meglio", usando la GUI! )
alephzero,

20
L'uso della GUI non è necessariamente "migliore". Il punto di usare gli script è automatizzare le cose, il che include garantire che lo script venga eseguito senza modifiche sul maggior numero possibile di dialetti unixy, o almeno sulla maggior parte dei dialetti che probabilmente incontrerai, ed è qui che questi vecchi problemi deprecati di compatibilità diventano un problema .
Guntram Blohm sostiene Monica

@alephzero Questo perché la versione in OS X è la versione BSD, con cui GNU mantiene la compatibilità.
Barmar,

14

-fnon fa nulla. È conservato per compatibilità storica (con BSD touchsecondo info touch), in modo che le applicazioni che si aspettano che esistano non lo passano e ricevono un messaggio di errore che dice che non esiste. Supponendo che si tratti di coreutils GNU, è possibile vedere nell'origine che questo fa semplicemente uno breakswitch di elaborazione delle opzioni senza fare nulla.

Come opzione ignorata, -fè presente dalla prima versione del touchcomando GNU aggiunta nel 1992 ( vedi diff ). Sembra che, almeno in FreeBSD v9, -f"tenti di forzare l'aggiornamento, anche se attualmente i permessi sui file non lo consentono" (come trovato da Sukminder, grazie).


2
infola pagina dice Ignorato; per compatibilità con le versioni BSD di `touch '.
heemayl

@heemayl Tranne che non sono riuscito a trovare un BSD che sembra spedire con un argomento "-f" da toccare, quindi deve essere piuttosto vecchio.
Chris Down,

Hmm .. Ho appena controllato il manuale di Coreutils , che dice: "Ignorato; per compatibilità con le versioni di tocco BSD".
Pandya,

3
-fè / è stato usato per provare a forzare l'aggiornamento anche se i permessi sui file lo hanno permesso su BSD. Non in V10, ma v9: freebsd.org/cgi/… (almeno su FreeBSD).
Runium

@sukminder Ace, grazie! Aggiungerò le tue informazioni nella risposta.
Chris Down,

12

Ogni volta che vedi "l'opzione X viene ignorata" nell'output --help o in una manpage, ciò significa: il programma accetta l' opzione X - non ottieni un errore di sintassi - ma non ha alcun effetto. Il programma fa la stessa cosa che avrebbe fatto in assenza dell'opzione.

Come dimostrano le altre risposte, questo viene fatto per compatibilità con le versioni precedenti. Un'opzione usata per avere qualche effetto, qualunque cosa abbia fatto non è più utile, e fare la stessa cosa indipendentemente dall'opzione è il giusto comportamento di compatibilità.


0

Quando si osserva il commento nel codice sorgente storico , riga 22:

  22   -f                     (ignored)\n\

l'opzione -f doveva essere ignorata dalla versione iniziale di Jim Meyering.

E l'istruzione switch per gestire le opzioni ha un caso esplicito (righe 150/151) per non fare nulla:

 150         case 'f':
 151           break;

È straordinario ciò che ha motivato i seguenti autori dal 1992 a mantenere questa opzione ignorata. Forse c'è uno scenario di utilizzo che richiede l'opzione -f e altrimenti si interrompe?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.