Pourquoi Touch crée-t-il de nouveaux fichiers?

13

Je suis conscient que la touchcommande est utilisée pour mettre à jour la date de la dernière modification sur un fichier. Il est également utilisé pour créer un nouveau fichier si le fichier demandé n'existe pas sur le système de fichiers.

Puisque touch (comme son nom l'indique), devrait simplement mettre à jour la dernière date de modification, pourquoi essaie-t-il également de créer un nouveau fichier?

S'agit-il simplement d'un chèque écrit dans le code tactile, ou est-ce autre chose qui provoque la création d'un fichier?

Alex McCourt
la source
Comme cas d'utilisation, j'utilise touch /forcefsckpour créer un fichier vide appelé /forcefsckpour forcer la vérification des erreurs des systèmes de fichiers lors du prochain redémarrage. Le fichier lui-même n'a besoin de rien contenir, il doit simplement exister. Sans touch, je devrais utiliser viou nanoenregistrer un fichier vierge. Beaucoup plus rapide à utiliser touch.
Tim
@Tim Il n'y a aucune raison réelle pour laquelle vous ne pourriez pas utiliser >/forcefsckou printf '' >>/forcefsck(ce dernier conserverait tout contenu existant). Ce que vous décrivez est une façon d'utiliser un utilitaire qui fonctionne d'une certaine manière, mais cela n'a aucune incidence réelle sur la raison pour laquelle il est écrit pour fonctionner de cette façon.
un CVn le
Si cette question concerne la conception touchplutôt que la façon dont cela fonctionne, je pense que cela touchviole le principe de responsabilité unique avec l'effet secondaire de création de fichier. Par conséquent, le «pourquoi» est simplement dû aux premiers choix de conception qui se sont bloqués en raison de la popularité et de la prévalence / facilité d'utilisation.
George Pantazes du

Réponses:

15

Utilisation des strace touch trendements:

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

C'est dans touchle code de et je n'appellerais pas ça un chèque . L'horodatage est mis à jour en ouvrant le fichier en écriture puis en le fermant.

VaTo
la source
14

touchcrée un nouveau fichier vide si le fichier n'existe pas parce que c'est pour cela qu'il a été conçu. L'utilitaire doit contenir du code pour gérer spécifiquement ce cas. L'utilitaire est apparu dans Unix V7 ; son manuel le décrit ainsi:

touch - date de mise à jour de la dernière modification d'un fichier

touchtente de définir la date de modification de chaque fichier . Cela se fait en lisant un caractère du fichier et en le réécrivant. Si un ** fichier * n'existe pas, une tentative sera faite de le créer à moins que l' -coption ne soit spécifiée.

(Je ne sais pas ce qui touchs'est passé si le fichier était vide. L' appel système sous-jacent est venu plus tard.)

Je ne sais pas exactement pourquoi a touchété conçu pour que le fichier existe, mais je pense que c'est à cause de cela make. Pourquoi voudriez-vous définir l'heure de modification d'un fichier à l'heure actuelle? Il y a des cas où il pourrait être utile de régler l'heure de modification à une heure particulière, mais cette capacité est venue plus tard, l'original touchne pouvait que régler l'heure de modification à l'heure actuelle. Une raison pour cela est de réexécuter une makerègle qui dépend du fichier.

Autrement dit, supposons que vous ayez un fichier fooet un makefile qui déclare une commande à barpartir de laquelle générer foo. Lorsque vous tapez make bar, la commande est exécutée et barcréée. Si barexiste et est plus récent que foo, make barne fait rien, car makesuppose qu'il bara déjà été généré. Cependant, s'il barest plus ancien que foo, pensez qu'il barn'est pas à jour et doit être régénéré.

Mais que faire si les règles à générer baront changé? Ensuite, vous avez deux options:

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

Vous auriez besoin food'exister pour générer bar, sinon la commande ne fonctionnerait généralement pas.

La terminologie «tactile» était également présente dans l' makeutilitaire: make -t barne ferait que faire semblant d'exécuter les commandes, c'est-à-dire qu'elle définirait l'heure de modification de barl'heure actuelle sans réellement exécuter la commande à générer bar(vous le feriez si vous pensiez que les modifications foone devraient pas affecter bar). L' touchutilitaire était donc une version autonome de la make -tfonctionnalité.

Gilles 'SO- arrête d'être méchant'
la source