Inutile d'utiliser de chat?
C'est probablement dans de nombreux Faq - au lieu d'utiliser:
cat file | command
(qui est appelé inutile l'utilisation de chat), de manière correcte censé être:
command < file
Dans la 2e, la "bonne" façon - système d'exploitation n'ont pas à se frayer un supplément de processus.
En sachant que, j'ai continué à utiliser inutiles chat pour 2 raisons.
-
plus esthétique - j'aime quand les données sont transférées de manière uniforme à partir de la gauche vers la droite. Et il est plus facile de remplacer
cat
avec quelque chose d'autre (gzcat
,echo
, ...), d'ajouter un 2ème fichier ou insérez un nouveau filtre (pv
,mbuffer
,grep
...). -
J'ai "senti" qu'il pourrait être plus rapide dans certains cas. Plus rapide car il y a 2 processus, 1er (
cat
) la lecture et la deuxième n'a quoi que ce soit. Et ils peuvent s'exécuter en parallèle, ce qui signifie parfois plus rapide d'exécution.
Est ma logique correcte (pour la 2ème raison)?
cat
est une identité pipe. Il ne ruisseaux de son entrée à sa sortie. Si le deuxième programme de la chaîne peut prendre son entrée à partir de la même argument que vous passez àcat
(ou de l'entrée standard, si vous ne transmettez pas d'argument), puiscat
est absolument inutile, et seuls les résultats dans un processus supplémentaire d'être fourchue et un tuyau en cours de création.- quand le chat n'a pas d'arguments ou de son argument est
-
, c'est une identité, d'une pipe. Quand il a plus d'un non-dash argument filename il devient quelque chose de plus qu'une identité, d'une pipe, si, et commence à servir un but réel. - vrai, la concaténation, mais encore certains programmes se comportent de la même façon (
head
,tail
,grep
). Peut-être que je devrais avoir ditarguments
, pluriel 🙂 - L'ancien populaire lien partmaps.org est malheureusement mort. Le contenu est maintenant au porkmail.org/era/unix/award.html
- Connexes: qu'est-Ce que le consensus général sur “Inutile l'utilisation de chat”?
- Voir aussi: unix.stackexchange.com/q/511827/20336
Vous devez vous connecter pour publier un commentaire.
Je n'étais pas au courant de la sentence jusqu'à aujourd'hui, quand certains recrue essayé à la broche de la UUOC sur moi pour l'un de mes réponses. C'était un
cat file.txt | grep foo | cut ... | cut ...
. Je lui ai donné un morceau de mon esprit, et seulement après avoir visité le lien qu'il m'a donné en se référant aux origines de la bourse et de la pratique de le faire. Recherche m'a conduit à cette question. Malheureusement, malgré conscient considération, aucune des réponses compris mon raisonnement.Je n'avais pas destiné à être sur la défensive dans la réponse à lui. Après tout, dans mes jeunes années, j'aurais écrit la commande comme
grep foo file.txt | cut ... | cut ...
car à chaque fois que vous ne le fréquente uniquegrep
s vous savoir l'emplacement du fichier en argument et il est prêt connaissance que le premier est le modèle et les derniers sont les noms de fichier.C'était un choix conscient d'utiliser
cat
lorsque j'ai répondu à la question, en partie à cause d'une raison de "bon goût" (dans les mots de Linus Torvalds), mais surtout pour une raison convaincante de la fonction.La dernière raison est plus important donc je vais le mettre en premier. Lorsque j'offre un pipeline comme une solution, j'attends qu'il soit réutilisable. Il est très probable qu'un pipeline serait ajouté à la fin ou épissé dans un autre pipeline. Dans ce cas, avoir un fichier en argument à la commande grep vis jusqu'à la possibilité de réutilisation, et peut-être le faire silencieusement sans un message d'erreur si le fichier en argument existe. I. e.
grep foo xyz | grep bar xyz | wc
vous donnera le nombre de lignes dansxyz
contenirbar
pendant que vous attendez le nombre de lignes qui contiennent à la foisfoo
etbar
. Avoir à changer les arguments d'une commande d'un pipeline avant de l'utiliser, elle est sujette aux erreurs. Ajoutez à cela la possibilité de le silence des échecs et il devient particulièrement insidieuse de la pratique.L'ancien raison n'est pas sans importance non plus car beaucoup de "bon goût"
simplement est une interface intuitive subconscient justification pour des choses comme le silence de pannes ci-dessus que vous ne pouvez pas penser au moment où une personne dans le besoin de l'éducation dit: "mais n'est-ce pas que le chat inutile".
Cependant, je vais essayer aussi de prendre conscience de la ancien "le bon goût" pourquoi je l'ai mentionné. Que la raison a à voir avec le plan orthogonal à l'esprit de Unix.
grep
ne pascut
etls
ne pasgrep
. Donc, à tout le moinsgrep foo file1 file2 file3
va à l'encontre de l'esprit design. Le orthogonale de la façon de le faire estcat file1 file2 file3 | grep foo
. Maintenant,grep foo file1
est simplement un cas particulier degrep foo file1 file2 file3
, et si vous ne le traitez pas la même que vous êtes au moins à l'aide de jusqu'au cerveau cycles d'horloge en essayant d'éviter l'inutile chat prix.Qui nous amène à l'argument que
grep foo file1 file2 file3
est la concaténation, etcat
concatène donc c'est bon pourcat file1 file2 file3
mais parce quecat
n'est pas la concaténation danscat file1 | grep foo
nous sommes donc violation de l'esprit des deux lescat
et le tout-puissant Unix. Eh bien, si tel est le cas, alors Unix aurait besoin d'une autre commande pour lire la sortie d'un fichier et de cracher sur la sortie standard (pas paginer ou quoi que ce soit juste une pure cracher sur la sortie standard stdout). Vous aurez donc la situation où vous ditescat file1 file2
ou vous diredog file1
et consciencieusement n'oubliez pas d'évitercat file1
pour éviter de contracter le prix, tout en évitant ladog file1 file2
depuis espérons que la conception dedog
permettrait de lever une erreur si plusieurs fichiers sont spécifiés.Espérons-le, à ce stade, vous sympathiser avec les Unix concepteurs de ne pas inclure une commande distincte pour cracher un fichier sur la sortie standard, tout en nommant
cat
pour concaténer plutôt que de les donner un autre nom.<edit>
retiré incorrect commentaires sur<
, en fait,<
est un moyen efficace de non-copie de la facilité à cracher un fichier sur la sortie standard que vous pouvez position au début d'un pipeline pour le Unix concepteurs ne comprennent quelque chose spécifiquement pour cette</edit>
La prochaine question est: pourquoi est-il important d'avoir des commandes qui ne fait que cracher un fichier ou la concaténation de plusieurs fichiers sur la sortie standard, sans autre traitement? Une des raisons est d'éviter d'avoir à chaque commande Unix qui fonctionne sur l'entrée standard de savoir comment analyser au moins une ligne de commande du fichier en argument et l'utiliser comme si elle existe. La deuxième raison est d'éviter que les utilisateurs n'oubliez pas: (a) lorsque le nom de fichier arguments vont; et (b) éviter le silence pipeline bug comme mentionné ci-dessus.
Qui nous amène à pourquoi
grep
a la logique supplémentaire. Le principe est de permettre à l'utilisateur d'aisance pour les commandes qui sont utilisés fréquemment et sur une autonome base (plutôt que comme un pipeline). C'est un compromis d'orthogonalité pour un gain significatif en termes de convivialité. Pas toutes les commandes doivent être conçues de cette manière et les commandes qui ne sont pas fréquemment utilisés devraient éviter complètement la logique supplémentaire de présenter des arguments (souvenez-vous de la logique supplémentaire entraîne inutile de fragilité (la possibilité d'un bug)). L'exception est de permettre à des arguments de fichier comme dans le cas degrep
. (Au passage, notez quels
a une toute autre raison non seulement à accepter, mais assez bien besoin de fichier d'arguments)Enfin, ce qui aurait été possible de faire mieux, c'est si exceptionnelle des commandes comme
grep
(mais pas nécessairementls
) générer une erreur si l'entrée standard est également disponible lorsque le fichier arguments sont spécifiés.grep
est invoquée avec de multiples noms de fichiers, il les préfixes les lignes trouvées avec le nom du fichier qu'il a été trouvé dans (sauf si vous tournez le comportement off). Il peut également signaler les numéros de ligne dans les fichiers individuels. Si seulement utilisercat
pour nourrirgrep
, vous perdez les noms de fichiers et les numéros de ligne sont continues sur tous les fichiers, pas par fichier. Il y a donc des raisons pour avoirgrep
gérer plusieurs fichiers de même quecat
ne peut pas gérer. Le seul fichier et zéro fichier cas sont simplement des cas spéciaux de la générale de multi-utilisation du fichier degrep
.< file command1 ...
. Bien que la position classique de l'I/O opérateurs de redirection est après le nom de la commande et ses arguments, c'est seulement à la convention et non obligatoire de placement. Le<
ne doivent précéder le nom de fichier. Ainsi, il y a près d'une symétrie parfaite entre>output
et<input
redirections:<input command1 -opt 1 | command2 -o | command3 >output
.<
compte tenu de son positionability et de l'efficacité. et il semble bien que les commandes que de prendre plusieurs arguments de fichier de le faire pour des raisons autres que la maîtrise. par exemplewc
lorsque plusieurs arguments des listes de nombres pour chaque fichier. je soupçonne un futur noyau permettra d'identité pipes dans l'espace noyau (lien ci-dessous), de sortecat single_file
pourrait éventuellement éviter les copies. je ne trouve toujours pas lecat
inutile par un tronçon. si vous utilisezgrep
avec les numéros de ligne de votre pipeline n'est pas appendable à toute autre pipeline. si c'est de la vanille grep,cat
gagne de l'OMI.cat
est inutile. Ce n'est pas quecat
est inutile; c'est que l'une de construire n'a pas besoin de l'utilisation decat
. Si vous aimez, notez que c'est UUoC (Inutile d'Utiliser decat
), et pas UoUC (Utilisation de l'Inutilecat
). Il existe de nombreuses occasions oùcat
est le bon outil à utiliser; je n'ai aucun problème avec elle être utilisée que lorsque cela est le bon outil à utiliser (et, en effet, parler d'un cas dans ma réponse).cat
avant un pipeline. il s'agit probablement d'un accord ou en désaccord situation en raison de l'inutilité est UNIQUEMENT pour des raisons de performances. je ne suis pas banaliser l'incidence sur les performances. si c'était java je serais d'accord. mais c'est un environnement de script, et il est injuste de de manière disproportionnée appel inutile utilise juste pourcat
lorsque l'inefficacité s'applique également à dire:<file grep foo | grep bar
et d'autres constructions. j'. e. "si j'avais un nickel pour chaque optimisable pipeline..."sort
dans un pipeline). le Haskell évaluation différée des gens pourrait également avoir des idées sur la meilleure façon de l'appliquer dans un disque en moins orientée vers l'environnement. je me demande comment font-ils effondrement de leurs pipelines.cat
dans le tuyau à de ne pas être un gros problème, selon les données, mais lorsqu'il est utilisé comme un environnement de programmation, il peut être absolument nécessaire à la mise en œuvre de ces critiques pour les performances des choses; surtout lorsqu'il s'agitbash
qui, en terme de performance, c'est comme un rectangularly en forme de roue (par rapport àksh
de toute façon. Je suis en train jusqu'à 10x plus lent ici - sans blague). Vous ne vous voulez optimiser vos fourches (et pas seulement) lorsque vous traitez avec de gros scripts ou des grandes boucles.cat
envisager le positionnement d'ungrep
. un très sélectivegrep
tôt dans le pipeline améliore les performances, comme le fait un permissivegrep
à la fin. mais la notion de structure dans votre cerveau, et que d'un autre lecteur a une autre structure optimale. quand le sacrifice de la carte cognitive? lorsque la loi d'amdahl l'a dit?cat file | (grep foo $myfile; grep bar)
je ne veux vraiment pas un avertissement de la premièregrep
. C'est très réaliste si l'(...)
est une fonction.cat | grep | cut | sort
sera toujours beaucoup plus lent que par exemple une exécution unique deawk
faire de la logique, parfois des magnitudes plus lent. Dans mon livre, il n'est pas sur la façon d'éviter un seulcat
(dont les chiffres de votre spectacle ne fait pas une énorme différence, selon le débit - merci pour ça, d'ailleurs) mais l'écriture smart (en tant que bien que rapide et lisible) du code.Non!
Tout d'abord, il n'est pas n'importe où, dans une commande de la redirection se passe. Donc si vous aimez votre redirection vers la gauche de votre commande, c'est très bien:
est le même que
Deuxième, il y a n + 1 et des processus de shell interne est exécuté qui se passe lorsque vous utilisez un tuyau. Il est certainement plus lent. Dans certains cas, n aurait été de zéro (par exemple, lorsque vous avez une redirection vers une commande interne du shell), donc en utilisant
cat
vous êtes l'ajout d'un nouveau processus entièrement inutilement.Comme une généralisation, à chaque fois que vous vous trouvez à l'aide d'un tuyau, il vaut la peine de prendre 30 secondes pour voir si vous pouvez l'éliminer. (Mais probablement pas la peine de prendre beaucoup plus de temps de 30 secondes.) Voici quelques exemples où les tuyaux et les processus sont fréquemment utilisés inutilement:
N'hésitez pas à modifier afin d'ajouter d'autres exemples.
< cat grep dog
est un exemple artificiel pour montrer que vous ne pouvez pas facilement dire entre le fichier d'entrée, la commande qui reçoit l'entrée, et les arguments de la commande.stdout=$(foo bar -exec baz <qux | ENV=VAR quux)
. Q. est-ce que<qux
s'appliquent àfoo
, ou àbaz
, qui est-exec
d parfoo
? A. Il s'applique àfoo
, mais peut semblent ambiguës. Mettre<qux
avantfoo
dans ce cas est plus clair, bien que moins fréquent, et est analogue à la fuiteENV=VAR quux
.<"foo"'
préfixe de la syntaxe; toujours pensé que la redirection est allé à la fin 🙂Avec le UUoC version,
cat
y a qu'à lire le fichier dans la mémoire, puis l'écrire dans le canal, et la commande a qu'à lire les données dans le canal, de sorte que le noyau est de copier l'ensemble du fichier trois, tandis que dans l'redirigé cas, le noyau n'a qu'à copier le fichier à la fois. Il est plus rapide de faire quelque chose une fois que de le faire trois fois.À l'aide de:
est complètement différent et pas forcément inutile l'utilisation de
cat
. Il est inutile si la commande est un filtre standard qui accepte de zéro ou plus de nom de fichier arguments et les processus à leur tour. Envisager latr
de commande: c'est un pur filtre qui ignore ou rejette nom de fichier arguments. Pour nourrir plusieurs fichiers, vous devez utilisercat
comme indiqué. (Bien sûr, il y a une autre discussion que la conception detr
n'est pas très bonne; il n'y a pas vraiment de raison qu'il ne pouvait pas avoir été conçu comme un filtre standard.) Cela pourrait aussi être valable que si vous voulez que la commande à traiter toutes les entrées dans un seul fichier plutôt que comme plusieurs fichiers distincts, même si la commande acceptent plusieurs fichiers distincts: par exemple,wc
est une telle commande.C'est le
cat single-file
cas inconditionnellement inutile.Je suis en désaccord avec la plupart des instances de la trop béat UUOC Prix parce que, lors de l'enseignement de quelqu'un d'autre,
cat
est un endroit pratique, titulaire pour toute commande ou croustillant compliqué pipeline de commandes qui produisent de sortie adapté pour le problème ou la tâche en cours de discussion.Cela est particulièrement vrai sur des sites comme Dépassement de Pile, ServerFault, Unix & Linux ou tout de la SE sites.
Si quelqu'un en fait la demande, à propos de l'optimisation, ou si vous vous sentez comme l'ajout d'informations supplémentaires à ce sujet alors, grand, de parler sur la façon d'utiliser le chat est inefficace. Mais ne pas réprimander les gens parce qu'ils ont choisi de viser la simplicité et la facilité de compréhension de leurs exemples, plutôt que de look-at-me-faire-cool-suis-je! la complexité.
En bref, parce que le chat n'est pas toujours un chat.
Aussi parce que la plupart des gens qui aiment passer autour de l'attribution de UUOCs le faire, car ils sont plus préoccupés par montrer comment "intelligent" ils sont ce qu'ils sont sur l'aide à l'enseignement ou les gens. En réalité, ils démontrent qu'ils sont probablement juste un autre débutant qui a trouvé un petit bâton pour battre leurs pairs.
Mise à jour
Voici un autre UUOC que j'ai posté dans une réponse à https://unix.stackexchange.com/a/301194/7696:
UUOC pédants dirais que c'est un UUOC parce qu'il est facilement possible de faire
$filter
par défaut à la chaîne vide et ont laif
déclaration nefilter='| grep -v "^$"'
mais l'OMI, par ne pas intégrer le caractère pipe dans$filter
, cette "inutile"cat
sert extrêmement utile à des fins d'auto-documenter le fait que$filter
sur leprintf
ligne n'est pas juste un autre argument poursqlplus
, c'est une option sélectionnable par l'utilisateur filtre de sortie.Si il y a besoin d'avoir plusieurs option de sortie des filtres, l'option de traitement pourrait simplement ajouter
| whatever
à$filter
aussi souvent que nécessaire - un extracat
dans le pipeline n'est pas mal quoi que ce soit ou causer une perte notable de performance.==
à l'intérieur de[ ]
n'est pas spécifiée par POSIX, et non pas toutes les implémentations de l'accepter. La standardisation de l'opérateur est juste=
.Dans défense de chat:
Oui,
ou
est plus efficace, mais beaucoup d'invocations n'ont pas de problèmes de performance, de sorte que vous n'avez pas de soins.
ergonomique raisons:
Nous sommes habitués à lire de gauche à droite, donc une commande comme
est facile à comprendre.
a pour sauter par-dessus de fabrication1, puis de les lire de gauche à droite. Ce peut être guérie par:
semble d'une certaine manière, comme s'il y avait une flèche pointant vers la gauche, où rien ne l'est. Plus de confusion et de la recherche comme de fantaisie devis est:
et de générer des scripts est souvent un processus itératif,
où vous pouvez voir votre progression par étapes, tout en
pas de même des œuvres. Des moyens simples sont moins enclins à faire des erreurs et ergonomique commande enchaînement est simple avec un chat.
Un autre sujet, que la plupart des gens ont été exposés à > et < que les opérateurs de comparaison, longtemps avant l'utilisation d'un ordinateur et lors de l'utilisation d'un ordinateur en tant que programmeurs, sont plus souvent exposés à ces en tant que tel.
Et la comparaison des deux opérandes avec des < et >, est contre commutative, ce qui signifie
Je me souviens de la première fois à l'aide de < pour la redirection d'entrée, je craignais
pourrait dire la même chose que
et en quelque sorte remplacer mon un.sh script. Peut-être est-ce un problème pour beaucoup de débutants.
rares différences
Ce dernier peut être utilisé dans les calculs directement.
Bien sûr, le < peut être utilisé ici aussi, au lieu d'un fichier de paramètre:
mais qui s'en soucie - 15k?
Si j'irait parfois à des problèmes qui, sûrement, je voudrais changer mon habitude de facturation chat.
Lors de l'utilisation de très grande ou de de nombreux, de nombreux fichiers, en évitant le chat est très bien. Pour la plupart des questions de l'utilisation du chat est orthogonale, hors sujet, pas un problème.
Le démarrage de ces inutiles inutiles utilisation de chat de discussion sur chaque deuxième shell sujet est seulement gênant et ennuyeux. Obtenir une vie et d'attendre pour votre minute de gloire, lorsqu'ils traitent de questions de performances.
file > a.sh
vaut à lui seul la lecture de ce présent 🙂 Merci pour le partage!Un problème supplémentaire est que le tuyau peut silencieusement masque un shell interne est exécuté. Pour cet exemple, je vais remplacer
cat
avececho
, mais il existe le même problème.Vous pourriez vous attendre
x
pour contenirfoo
, mais il ne le fait pas. Lex
vous définissez était dans un shell interne est exécuté donné naissance à exécuter lewhile
boucle.x
dans le shell qui a commencé le pipeline a une autre valeur, ou n'est pas définie.Dans bash4, vous pouvez configurer les options d'environnement, de sorte que la dernière commande d'un pipeline s'exécute dans le même shell comme celui qui commence le pipeline, mais vous pouvez essayer ce
et
x
est une fois de plus, local à l'while
's shell interne est exécuté.shopt -s lastpipe
pour éviter de créer de la shell interne est exécuté.Comme quelqu'un qui régulièrement points et d'un certain nombre d'autres programmation shell antipatterns, je me sens obligé de, tardivement, de peser dans.
Script Shell est très bien un copier/coller de la langue. Pour la plupart des gens qui écrivent les scripts shell, ils ne sont pas là pour apprendre la langue, c'est juste un obstacle à surmonter pour continuer à faire des choses dans la ou les langue(s) ils sont en fait assez bien.
Dans ce contexte, je le vois comme un élément perturbateur et potentiellement destructrice pour propager les différents scripts shell anti-modèles. Le code que quelqu'un le trouve sur Stack Overflow, idéalement, devrait être possible de copier/coller dans leur environnement avec un minimum de modifications, et de la compréhension incomplète.
Parmi les nombreux scripts shell ressources sur le net, Stack Overflow est inhabituel dans la mesure où les utilisateurs peuvent contribuer à façonner la qualité du site en modifiant les questions et les réponses sur le site. Cependant, code de modifications peuvent être problématiques car il est facile de faire des changements qui n'étaient pas prévus par le code de l'auteur. Par conséquent, nous avons tendance à nous laisser des commentaires afin de suggérer des modifications pour le code.
La UUCA et liées antipattern commentaires ne sont pas seulement pour les auteurs du code commentaire; ils sont autant un caveat emptor pour aider lecteurs du site de devenir conscient des problèmes dans le code qu'ils trouvent ici.
On ne peut pas espérer parvenir à une situation où aucune des réponses sur un Débordement de Pile recommander inutile
cat
s (ou non cotées variables, ouchmod 777
, ou à une grande variété d'autres antipattern fléaux), mais on peut au moins aider à éduquer l'utilisateur qui est sur le point de copier/coller ce code dans les recoins les plus profonds boucle serrée de leur script qui exécute des millions de fois.Autant que des raisons techniques, aller, la sagesse traditionnelle, c'est que nous devrions essayer de minimiser le nombre de processus externes; c'est toujours une bonne orientation générale lors de l'écriture de scripts shell.
cat
est beaucoup de changements de contexte et de bande passante mémoire (et de la pollution de cache L3 de copies supplémentaires de données danscat
's en lecture de la mémoire tampon, et le tuyau de tampons). Surtout sur un grand multi-core de la machine (comme beaucoup d'hébergement configurations de cache / mémoire, la bande passante est une ressource partagée.bzip2
etgzip
de compression sont à la fois très lent par rapport au montant des frais générauxcat
ajoute à cela seul (avec la machine inactif). Il est difficile de lire vos tables (wrap ligne au moyen d'un numéro?).sys
temps augmente beaucoup, mais encore faible vs. utilisateur ou le real?J'utilise souvent
cat file | myprogram
dans les exemples. Parfois, je m'accuse de l'Inutile l'utilisation de chat (http://porkmail.org/era/unix/award.html). Je suis en désaccord pour les raisons suivantes:Il est facile de comprendre ce qui se passe.
Lors de la lecture d'une commande UNIX vous vous attendez à une commande suivie par des arguments suivie par la redirection. Il est possible de mettre la redirection n'importe où, mais il est rarement vus, donc les gens vont avoir un moment plus difficile la lecture de l'exemple. Je crois
est plus facile à lire que
Si vous déplacez la redirection vers le début vous êtes à confusion, des gens qui ne sont pas utilisés à cette syntaxe:
et les exemples doivent être faciles à comprendre.
Il est facile de changer.
Si vous connaissez le programme peut lire à partir de
cat
, vous pouvez normalement supposer qu'il peut lire le rendement de n'importe quel programme qui affiche sur la sortie standard, et donc vous pouvez l'adapter à vos propres besoins et d'obtenir des résultats prévisibles.Il souligne que le programme n'a pas manqué, si STDIN n'est pas un fichier.
Il n'est pas sûr de supposer que si
program1 < foo
fonctionne alorscat foo | program1
fonctionnera également. Cependant, il est sûr de supposer le contraire. Ce programme fonctionne si STDIN est un fichier, mais échoue si l'entrée est une pipe, parce qu'il utilise la recherche:Coût de
Il y a un coût supplémentaire
cat
. Pour donner une idée de la façon dont beaucoup j'ai couru quelques tests pour simuler des données de référence (cat
), à faible débit (bzip2
), moyen débit (gzip
), et à haut débit (grep
).Les tests ont été exécutés sur un bas de gamme (0.6 GHz) et un ordinateur portable ordinaire (2.2 GHz). Ils ont été exécutés 10 fois sur chaque système et le meilleur moment a été choisi pour imiter la situation optimale pour chaque test. L' $ISO ubuntu-11.04-desktop-i386.iso.
(Plus joli tableaux ici: http://oletange.blogspot.com/2013/10/useless-use-of-cat.html)
Les résultats montrent que pour les bas et moyen débit, le coût est de l'ordre de 1%. C'est bien dans l'incertitude des mesures, de sorte que, dans la pratique, il n'y a pas de différence.
Pour un débit élevé, la différence est plus grande et il y a une nette différence entre les deux.
Qui mène à la conclusion: Vous devez utiliser
<
au lieu decat |
si:Sinon il n'a pas d'importance si vous utilisez
<
oucat |
.Et donc vous ne devriez donner un UUoC-prix si et seulement si:
Je pense que (la manière traditionnelle) à l'aide de tuyau est un peu plus rapide; sur mon boitier j'ai utilisé
strace
commande pour voir ce qu'il se passe:Sans tuyau:
Et avec tuyau:
Vous pouvez faire quelques essais avec
strace
ettime
de commande avec de plus en plus de commandes pour de bon de l'analyse comparative.strace
montre qu'il est plus rapide – lestrace
n'est pas de retracer lewc -l
d'exécution dans le second cas. Il ne les traces de la première commande du pipeline ici.mkfifo()
surcharge de ou la redirection de frais généraux. En tant que tel, il est totalement dénué de pertinence pour la détermination de la performance réelle de delta; tout ce que vous êtes en comparant est la différence entrestrace wc -l
etstrace cat
-- le pipeline-vs-redirection différence n'a aucune incidence sur le contenu collé dans cette réponse.strace -f sh -c 'wc -l < wrong_output.c'
aux côtés destrace -f sh -c 'cat wrong_output.c | wc -l'
.strace
parce que ce n'est pas ce que nous voulons mesurer.) Mon test awc -l
sur 13 000 ligne fichier de 1000 fois dans un Bashfor n in {1..1000}
boucle.cat
: ideone.com/2w1W42#stderrpipe(2)
et ensuite bifurquer, et d'avoir la mère et de l'enfant à proximité différentes extrémités de la canalisation. Mais oui, cette réponse est un non-sens total, et n'a même pas essayer de compter les appels système ou de l'utilisationstrace -O
à mesure de la surcharge, ou-r
à l'horodatage de chaque appel par rapport à la dernière...