web-dev-qa-db-fra.com

Lors de la création d'un fichier vide, pourquoi peut-on préférer «toucher le fichier» à «: >> fichier»?

Je n'avais jamais réalisé que vous pouviez faire cela jusqu'à maintenant:

: >> file

Il semble être fonctionnellement similaire à:

touch file

Y a-t-il une raison pour laquelle la plupart des ressources semblent préférer toucher à ce shell intégré?

33
Harold Fischer

Vous n'avez même pas besoin d'utiliser :; vous pouvez simplement > file (au moins dans bash; d'autres shells peuvent se comporter différemment).

Sur le plan pratique, il n'y a pas de réelle différence ici (bien que les minuscules frais généraux de l'appel à /bin/touch est une chose).

touch, cependant, peut également être utilisé pour modifier les horodatages d'un fichier qui existe déjà sans changer ou effacer le contenu; plus loin, > file fera exploser tout file qui existe déjà. Cela peut être contourné en utilisant à la place >> file.

Une autre différence avec touch est que vous pouvez le faire créer (ou mettre à jour l'horodatage) plusieurs fichiers à la fois (par exemple touch foo bar baz quux) avec une syntaxe plus succincte qu'avec la redirection, où chaque fichier a besoin de sa propre redirection (par exemple >foo >bar >baz >quux).

Utilisation de touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Utilisation de la redirection:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
47
DopeGhoti

Parce que vous pouvez touch plusieurs fichiers à la fois sans taper de caractères spéciaux supplémentaires. Cela inclut des choses comme l'expansion de l'accolade, par exemple touch file{1,2,3,4}.

Un autre problème est que lorsque vous écrivez un didacticiel, il est plutôt important de réaliser que vos lecteurs ne sont probablement pas très familiarisés avec le sujet. Une simple commande peut être beaucoup plus compréhensible qu'une combinaison étrange de caractères non-lettre. Je m'attends à ce qu'il y ait un certain nombre d'utilisateurs de Shell occasionnels qui ne savent pas ce que : est, pour la simple raison qu'il ne fait pas vraiment faire quoi que ce soit. De même pour un simple > foo sans commande: même si vous savez ce qu'est une redirection, une redirection sans source peut ne pas être intuitive.

Ici aussi, sur unix.se, nous écrivons souvent des exemples de commandes avec un signe dollar pour indiquer l'invite. Les caractères spéciaux au début de la ligne peuvent être confondus avec cela. (Notez qu'il existe des systèmes et des shells qui utilisent > dans le cadre de l'invite par défaut.)

32
ilkkachu

Eh bien, pour moi, la raison principale est la lisibilité. Avec touch file vous savez ce qui se passe, même quelqu'un qui n'est pas très formé aux scripts Shell sait ce qui se passe. Et sinon, c'est facile à faire man touch et voyez ceci:

A FILE argument that does not exist is created empty

Avec les trucs cryptiques comme : et >, il est plus difficile de savoir ce qui se passe, et comme il n'y a aucun avantage réel, il n'est pas nécessaire de l'utiliser.

18
yo'

Imaginez que vous recherchez l'un de vos anciens scripts Shell dont vous vous souvenez seulement qu'un fichier marqueur dans/tmp est en cours de création. Il est facile de grep tous vos fichiers * .sh pour le mot "touch". À la place, chercher un deux-points donnera de nombreux faux positifs si vous ne savez pas quel nom de fichier exact rechercher.

6
B from C