À quoi sert l'option -f pour `touch`?

23

De man touch:

-f     (ignored)

Mais je ne comprends pas ce que l'on entend par ignoré .

J'ai essayé de suivre:

$ 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

Et remarqué qu'il change malgré tout les horodatages -f.

Donc, je veux savoir ce -fque ça veut dire ou ce que ça fait.

Pandya
la source
2
Je suppose que l' -foption est simplement ignorée. Peut-être déformé par l'analyseur d'arguments et c'est tout.
Thomas
1
(ignoré) signifie que l'indicateur est ignoré, pas la commande.
Fund Monica's Lawsuit

Réponses:

47

Pour les utilitaires GNU, la documentation complète se trouve dans la infopage, où vous pouvez lire:

-f
Ignoré; pour la compatibilité avec les versions BSD de `touch '.

Voir les pages de manuel BSD historiques pour le toucher , où -fdevait être forcé le toucher.

Si vous regardez la source de ces anciens BSD, il n'y a pas eu d' utimes()appel système, donc touchouvrez le fichier en mode lecture + écriture, lisez un octet, recherchez et réécrivez-le afin de mettre à jour le dernier accès et la dernière modification .

De toute évidence, vous aviez besoin d' autorisations de lecture et d' écriture ( touchévitez d'essayer de le faire si access(W_OK|R_OK)renvoyé faux ). -fessayé de contourner cela en modifiant temporairement les autorisations temporairement en 0666 !

0666 signifie la permission de lire et d'écrire pour tout le monde. Il devait en être autrement (comme avec une autorisation plus restrictive telle que 0600 qui aurait encore permis le toucher ) qui pourrait signifier pendant cette courte fenêtre, les processus qui auraient autrement lu ou écrit l'autorisation sur le fichier ne pourraient plus , rupture de fonctionnalité .

Cela signifie cependant que les processus qui n'auraient pas autrement accès au fichier ont maintenant une courte opportunité de l'ouvrir, ce qui brise la sécurité .

Ce n'est pas une chose très sensée à faire. Les touchimplémentations modernes ne font pas cela. Depuis lors, l' utime()appel système a été introduit, permettant de changer la modification et le temps d'accès séparément sans avoir à se mêler au contenu des fichiers (ce qui signifie qu'il fonctionne également avec des fichiers non réguliers) et n'a besoin que d'un accès en écriture pour cela.

GNU touchn'échoue toujours pas si l' -foption est passée , mais ignore simplement le drapeau. De cette façon, les scripts écrits pour ces anciennes versions de BSD n'échouent pas lorsqu'ils sont portés sur des systèmes GNU. Pas très pertinent de nos jours.

Stéphane Chazelas
la source
3
Selon developer.apple.com/library/mac/documentation/Darwin/Reference/… -f fonctionne toujours sous Mac OS X. (Mais il y a sans aucun doute au moins 57 façons différentes de réaliser la même fonctionnalité "mieux", en utilisant l'interface graphique! )
alephzero
20
L'utilisation de l'interface graphique n'est pas nécessairement "meilleure". Le but de l'utilisation de scripts est d'automatiser les choses, ce qui inclut de s'assurer que votre script s'exécute non modifié sur autant de dialectes unixy que possible, ou au moins sur la plupart des dialectes que vous êtes susceptible de rencontrer, et c'est là que ces anciens problèmes de compatibilité obsolètes deviennent une préoccupation .
Guntram Blohm prend en charge Monica
@alephzero C'est parce que la version sous OS X est la version BSD, avec laquelle GNU maintient sa compatibilité.
Barmar
14

-fne fait rien. Il est conservé pour une compatibilité historique (avec BSD touchselon info touch), de sorte que les applications qui s'attendent à ce qu'il existe ne le transmettent pas et reçoivent un message d'erreur indiquant qu'il n'existe pas. En supposant qu'il s'agit de coreutils GNU, vous pouvez voir dans la source que cela ne fait qu'un breakcommutateur de traitement d'option sans rien faire.

En tant qu'option ignorée, -fest présente à partir de la toute première version de la touchcommande GNU ajoutée en 1992 ( voir diff ). Il semble que, au moins dans FreeBSD v9, -f"essayez de forcer la mise à jour, même si les autorisations de fichier ne le permettent pas actuellement" (comme l'a trouvé Sukminder, merci).

Chris Down
la source
2
infola page dit Ignoré; pour la compatibilité avec les versions BSD de `touch '.
heemayl
@heemayl Sauf que je n'ai pas pu trouver un BSD qui semble expédier avec un argument "-f" à toucher, donc il doit être assez ancien.
Chris Down
Hmm .. Je viens de consulter le manuel de Coreutils , qui dit: "Ignoré; pour la compatibilité avec les versions BSD de touch."
Pandya
3
-fest / a été utilisé pour essayer de forcer la mise à jour même si les autorisations de fichier le permettaient sur BSD. Pas en V10, mais en v9: freebsd.org/cgi/… (de FreeBSD au moins).
Runium
@sukminder Ace, merci! Je vais ajouter vos informations dans la réponse.
Chris Down
12

Chaque fois que vous voyez "l'option X est ignorée" dans la sortie --help ou une page de manuel, cela signifie: le programme accepte l' option X - vous n'obtenez pas d'erreur de syntaxe - mais cela n'a aucun effet. Le programme fait la même chose qu'il aurait fait en l'absence de l'option.

Comme les autres réponses le démontrent, cela est fait pour une compatibilité descendante. Une option avait un certain effet, quoi qu'elle ait fait n'est plus utile, et faire la même chose quelle que soit l'option est le bon comportement de compatibilité.

zwol
la source
0

Lorsque vous regardez le commentaire dans le code source historique , ligne 22:

  22   -f                     (ignored)\n\

L'option -f devait être ignorée depuis la version initiale de Jim Meyering.

Et l'instruction switch pour gérer les options a un cas explicite (lignes 150/151) pour ne rien faire:

 150         case 'f':
 151           break;

C'est remarquable ce qui a motivé les auteurs suivants depuis 1992 à ne pas tenir compte de cette option. Peut-être y a-t-il un scénario d'utilisation qui nécessite l'option -f et sinon se casse?

Nous voyons
la source