Pour certaines commandes, il est possible de spécifier certaines entrées comme stdin ou comme argument de ligne de commande.
Plus précisément, supposez que vous command
pouvez prendre l'entrée stdin et un nom de fichier comme argument de ligne de commande, et command < myfile
, cat myfile | command
et command myfile
produire le même résultat.
Par exemple,
Lorsque la commande est sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Lorsque la commande est cat
:
cat < myfile
cat myfile
- Je me demandais s'il y avait des règles générales sur leurs performances, c'est-à-dire laquelle d'entre elles est généralement la plus efficace et laquelle la moins?
- La redirection est-elle toujours meilleure que la pipe?
Réponses:
La
cat file | command
syntaxe est considérée comme une utilisation inutile deCat
. De toutes vos options, il faut un impact sur les performances car il doit générer un autre processus dans le noyau. Aussi insignifiant que cela puisse se révéler, il s'agit de frais généraux que les autres formulaires n'ont pas. Cela a été couvert sur des questions telles que: Dois-je me soucier des chats inutiles?Entre les deux autres formes, il n'y a pratiquement aucune différence de performances. STDIN est un nœud de fichier spécial que le processus doit ouvrir et lire comme n'importe quel autre. Passer un nom de fichier au lieu de STDIN le fait simplement ouvrir un fichier différent.
La différence serait dans les fonctionnalités / flexibilité que vous recherchez.
sed -i
pour l'édition sur place. (Remarque: puisque cela doit créer un nouveau fichier en arrière-plan, ce n'est pas un gain de performances par rapport aux autres redirections, mais c'est une étape de commodité.)sed [exp] < file1 file2
ou mêmesed [exp] < <(grep command)
. Les détails de ce cas d'utilisation peuvent être trouvés sur cette question: Substitution de processus et tuyaula source
sed [exp] < <(grep command)
fonctionnera très bien commesed [exp] <(grep command)
(car<(grep command)
crée un fichier temporaire nommé pour la longueur de la commande quised
est parfaitement capable de s'ouvrir de lui-même sans l'aide du shell).Étant donné que cela
command file
ouvre simplement le fichier et fonctionne désormais comme s'il l'étaitstdin
, il n'y a pas de différence. Avec la redirection de shell, vous ouvrez simplement le fichier au préalable (le shell le fait), par opposition à la commande binaire elle-même.Si nous parlons de
cat file | command
vscommand <file
, alors ce dernier est préféré. Vous ne remarquerez pas de différence de performances significative entre les deux, mais la première est inutilement compliquée (processus supplémentaire et tampon de mémoire partagée pour le canal, avec un débit limité.) De plus, vous ne pouvez passeek
(changer la position du pointeur de fichier arbitrairement) dans un tuyau, tandis que vous pouvez dans un fichier ordinaire. Certaines commandes peuvent utiliser un algorithme plus efficace lorsqueseek
-ing dans le fichier d'entrée est possible.la source
<file
? Votre point est valable pour utiliser le nom du fichier d'entrée pour dériver le nom du fichier de sortie difficile, par exemple:gzip file
produitfile.gz
.close
sstdin
et appelledup
le descripteur de fichier ouvert, donc il remplace l'ancienstdin
(qui était une sorte de tty dans la plupart des cas.) Du point de vue du lecteur de film, il n'y a aucune différence entre cela et l'ouverture du fichier par son nom dans le joueur lui-même. Le descripteur de fichier est recherché dans les deux scénarios, donc lorsque nous sautons à la fin, il n'y a pas de différence détectable par l'utilisateur.