Perché il tocco crea nuovi file?


13

Sono consapevole che il touchcomando viene utilizzato per aggiornare la data dell'ultima modifica su un file. Viene anche usato per creare un nuovo file se il file richiesto non esiste sul file system.

Dal momento che il tocco (come suggerisce il nome), dovrebbe semplicemente aggiornare la data dell'ultima mod, perché prova anche a creare un nuovo file?

È solo un segno di spunta scritto nel codice del tocco o è qualcos'altro che provoca la creazione di un file?


Come caso di utilizzo, utilizzo touch /forcefsckper creare un file vuoto chiamato /forcefsckper forzare il controllo dei file system per errori al successivo riavvio. Il file stesso non deve contenere nulla, deve solo esistere. Senza touch, avrei bisogno di usare vio nanosalvare un file vuoto. Molto più veloce da usare touch.
Tim

@Tim Non c'è alcun motivo reale che non puoi usare >/forcefscko printf '' >>/forcefsck(quest'ultimo manterrebbe qualsiasi contenuto esistente). Quello che descrivi è un modo per usare un'utilità che funziona in un certo modo, ma che non ha alcuna influenza sul perché sia ​​scritta per funzionare in quel modo.
un CVn

Se questa domanda riguarda la progettazione touchpiuttosto che il modo in cui funziona, penso che touchvioli il principio di responsabilità singola con l'effetto collaterale della creazione di file. Pertanto, il "perché" è semplicemente dovuto alle prime scelte progettuali che sono rimaste bloccate a causa della popolarità e della prevalenza / facilità d'uso.
George Pantazes,

Risposte:


15

Utilizzando i strace touch trendimenti:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

È nel touchcodice di e non lo definirei comunque un assegno . Il timestamp viene aggiornato aprendo il file per la scrittura e quindi semplicemente chiudendolo.


14

touchcrea un nuovo file vuoto se il file non esiste perché è quello per cui è stato progettato. L'utilità deve contenere codice per gestire in modo specifico quel caso. L'utilità è apparsa in Unix V7 ; il suo manuale lo descriveva così:

tocco - data dell'ultima modifica di un file

touchtenta di impostare la data modificata di ciascun file . Questo viene fatto leggendo un carattere dal file e riscrivendolo. Se non esiste un ** file *, verrà effettuato un tentativo di crearlo a meno che non -csia stata specificata l' opzione.

(Non so che cosa ha touchfatto se il file era vuoto. La chiamata di sistema sottostante è arrivata più tardi.)

Non so per certo perché sia touchstato progettato per far esistere il file, ma sospetto che sia a causa di make. Perché dovresti voler impostare l'ora di modifica di un file sull'ora corrente? Ci sono casi in cui potrebbe essere utile impostare l'ora di modifica su un determinato momento, ma quell'abilità è arrivata in seguito, l'originale touchpoteva solo impostare l'ora di modifica sull'ora corrente. Un motivo per farlo è rieseguire una makeregola che dipende dal file.

Cioè, supponiamo di avere un file foo, e un makefile che dichiara un comando per generare barda foo. Quando si digita make bar, il comando viene eseguito e barviene creato. Se baresiste ed è più recente di foo, make barnon fa nulla, perché makepresuppone che barsia già stato generato. Tuttavia, se barè più vecchio di foo, pensa che barnon sia aggiornato e debba essere rigenerato.

E se le regole da generare barfossero cambiate? Quindi hai due opzioni:

  • rm bar; make bar
  • touch foo; make bar

Dovresti fooesistere per generare bar, altrimenti il ​​comando in genere non funzionerebbe.

La terminologia "touch" era presente anche makenell'utilità: make -t barfingeva solo di eseguire i comandi, ovvero impostava il tempo di modifica sull'ora barcorrente senza effettivamente eseguire il comando per generare bar(lo faresti se pensassi che le modifiche a foonon dovrebbero influire bar). L' touchutilità era quindi una versione autonoma della make -tfunzione.

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.