Quelle est la différence entre l'utilisation de «fichier tactile» et de «> fichier» lors de la création d'un nouveau fichier?

13

Je suis nouveau sur Linux. Quand je crée un nouveau fichier .gitignore sous le répertoire courant en utilisant bash, j'ai découvert que je peux faire:

> .gitignore

ou

touch .gitignore

Il semble qu'ils font la même chose. Lorsque je vérifie le manuel touch, il indique changer l'horodatage du fichier actuel, mais il n'y a pas de manuel pour >. Alors, quelqu'un peut-il expliquer ce qui peut >faire et y a-t-il une différence dans l'utilisation de ces deux commandes dans ce contexte? Merci.

Steve Deng Zishi
la source
1
Je suis curieux de savoir où vous avez appris à utiliser '>' comme générateur de fichiers sans
connaître
1
Vous trouverez la redirection documentée dans le manuel de Bash. Sur la ligne de commande, entrez la commande man bash. C'est un long document et il faudra des jours, voire des semaines pour bien comprendre, mais cela vaut la peine d'être parcouru si vous voulez apprendre le Bash à fond.
Paddy Landau

Réponses:

21

>est l'opérateur de redirection de shell. Voir Quelle est la différence entre ">" et ">>" dans la commande shell? et Quand dois-je utiliser <ou <() ou << et> ou> ()? Il est principalement utilisé pour rediriger la sortie d'une commande vers un fichier. Si le fichier n'existe pas, le shell le crée. S'il existe, le shell le tronque (le vide). Avec just > file, il n'y a pas de commande, donc le shell crée un fichier, mais aucune sortie ne lui est envoyée, donc l'effet net est la création d'un fichier vide, ou le vidage d'un fichier existant.

touchest une commande externe qui crée un fichier ou met à jour l'horodatage, comme vous le savez déjà. Avec touch, le contenu du fichier n'est pas perdu, s'il existe, contrairement à >.

Le comportement de >dépend du shell. Dans bash, dash et la plupart des shells, > foofonctionnera comme prévu. Dans zsh, par défaut, > foofonctionne comme cat > foo- zsh attend que vous saisissiez l'entrée.

muru
la source
10
Le point clé ici est qu'il n'y a pas de différence pratique entre >> fileet touch filemais s'il filen'existe pas, il y a une grande différence entre les deux et > file(en ce que le contenu précédent de fileest perdu). Cela, plus le comportement incohérent des moyens zsh touch fileest le "plus sûr" et devrait donc être mémorisé comme la bonne façon de le faire.
Monty Harder
1

Voici une comparaison intéressante:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Résultat:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
la source
1
Bien que la comparaison puisse être intéressante, je ne vois pas vraiment ce que vous voulez que je voie ici. Pouvez-vous expliquer ce que vous cherchez? Je suppose que ce sont différentes façons d'écrire des choses dans des fichiers, mais je trouve cela un peu déroutant comme ça. Cela pourrait être mon manque de café.
m00am
@ m00am ce qui est montré ici est en fait 8 façons différentes de créer un fichier. straceest censé montrer les appels système qui sont exécutés, et la > file.txtméthode s'avère être le moins d'appels système exécutés, ce qui n'est vraiment pas si surprenant - plus un outil est complexe, plus ses appels système sont complexes. Le problème avec les exemples montrés, cependant, est que les straceécritures sont diffusées stderrpar défaut, et dans cette réponse, Steven utilise le tuyau en lecture seule stderr, donc je suis légèrement confus sur la façon dont il a compté les lignes en utilisant le |tuyau et non|&
Sergiy Kolodyazhnyy
Et sur Ubuntu 16.04, en utilisant |&, comme le mentionne @Serg, j'obtiens environ un cinquième de ceux ici ... sauf pour le vicas, où j'obtiens à peu près la même valeur
muru
WSL? Woah ... Je ne pensais pas que WSL ajouterait que de nombreux appels système pour ce qu'il fait.
muru
@muru Cygwin - WSL n'est pas encore prêt stackoverflow.com/a/40370009
Steven Penny