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 -f
que ça veut dire ou ce que ça fait.
-f
option est simplement ignorée. Peut-être déformé par l'analyseur d'arguments et c'est tout.Réponses:
Pour les utilitaires GNU, la documentation complète se trouve dans la
info
page, où vous pouvez lire:Voir les pages de manuel BSD historiques pour le toucher , où
-f
devait être forcé le toucher.Si vous regardez la source de ces anciens BSD, il n'y a pas eu d'
utimes()
appel système, donctouch
ouvrez 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 siaccess(W_OK|R_OK)
renvoyé faux ).-f
essayé 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
touch
implé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
touch
n'échoue toujours pas si l'-f
option 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.la source
-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! )-f
ne fait rien. Il est conservé pour une compatibilité historique (avec BSDtouch
seloninfo 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'unbreak
commutateur de traitement d'option sans rien faire.En tant qu'option ignorée,
-f
est présente à partir de la toute première version de latouch
commande 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).la source
info
la page dit Ignoré; pour la compatibilité avec les versions BSD de `touch '.-f
est / 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).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é.
la source
Lorsque vous regardez le commentaire dans le code source historique , ligne 22:
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:
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?
la source