Tout d'abord, cat
écrit sur la sortie standard, qui n'est pas nécessairement un terminal, même s'il a cat
été tapé dans le cadre d'une commande dans un shell interactif. Si vous avez vraiment besoin de quelque chose à écrire sur le terminal même lorsque la sortie standard est redirigée, ce n'est pas si facile (vous devez spécifier quel terminal, et il pourrait même ne pas y en avoir un si la commande est exécutée à partir d'un script), même si un pourrait (ab) utiliser la sortie d'erreur standard si la commande fait simplement partie d'un pipeline. Mais puisque vous avez indiqué que cela cat
fait vraiment l'affaire, je suppose que vous ne posiez pas de question sur une telle situation.
Si votre objectif était d'envoyer ce qui est écrit sur la sortie standard dans un pipeline, alors l'utilisation cat
serait éligible au prix Useless Use of Cat , car cat file | pipeline
(où pipeline
signifie n'importe quel pipeline) peut être fait plus efficacement <file pipeline
. Mais encore une fois, de votre formulation, je déduis que ce n'était pas votre intention.
Il n'est donc pas si clair de quoi vous vous inquiétez. Si vous trouvez cat
trop de temps pour taper, vous pouvez définir un alias à un ou deux caractères (il y a encore quelques noms de ce type qui restent inutilisés dans Unix standard). Si toutefois vous vous inquiétez de cat
passer des cycles inutiles, vous ne devriez pas.
S'il y avait un programme null
qui ne prend aucun argument et copie simplement l'entrée standard vers la sortie standard (l'objet neutre pour les pipelines), vous pouvez faire ce que vous voulez <file null
. Il n'y a pas un tel programme, bien qu'il soit facile d'écrire (un programme C avec juste une fonction d'une ligne main
peut faire le travail), mais appeler cat
sans arguments (ou cat -
si vous voulez être explicite) fait exactement cela.
S'il y avait un nocat
programme qui prend exactement un argument de nom de fichier, essaie d'ouvrir le fichier, se plaint s'il ne peut pas, et sinon procède à la copie du fichier vers la sortie standard, alors ce serait exactement ce que vous demandez. Il n'est que légèrement plus difficile à écrire que null
, le travail principal étant d'ouvrir le fichier, de tester et éventuellement de se plaindre (si vous êtes méticuleux, vous voudrez peut-être également inclure un test indiquant qu'il existe un seul argument et vous plaindre du contraire). Mais encore une fois cat
, maintenant fourni avec un seul argument, fait exactement cela, donc il n'y a pas besoin de nocat
programme.
Une fois que vous avez réussi à écrire le nocat
programme, pourquoi s'arrêter à un seul argument? Envelopper le code dans une boucle for(;*argp!=NULL;++argp)
n'est vraiment pas du tout un effort, ajoute tout au plus quelques instructions machine au binaire, et évite d'avoir à se plaindre d'un nombre incorrect d'arguments (ce qui épargne beaucoup plus d'instructions). Voilà une version primitive de cat
concaténation de fichiers. (Pour être honnête, vous devez le modifier un peu afin que, sans arguments, il se comporte comme null
.)
Bien sûr, dans le vrai cat
programme, ils ont ajouté quelques cloches et sifflets, car ils le font toujours. Mais l'essentiel est que l'aspect "concaténation" des cat
coûts ne demande vraiment aucun effort, ni pour le programmeur ni pour la machine qui l'exécute. Le fait que cat
subsume null
et nocat
explique la non-existence de tels programmes. Évitez d'utiliser cat
avec un seul argument si le résultat va dans un pipeline, mais s'il est utilisé uniquement pour afficher le contenu du fichier sur le terminal, même la page à laquelle je suis lié admet qu'il s'agit d'une utilisation utile cat
, alors n'hésitez pas.
Vous pouvez tester ce qui cat
est vraiment implémenté par une simple boucle autour d'une nocat
fonctionnalité hypothétique , en appelant cat
avec plusieurs noms de fichiers parmi lesquels un nom invalide, pas en première position: plutôt que de vous plaindre tout de suite que ce fichier n'existe pas, cat
vide d'abord le précédent des fichiers valides, puis se plaint du fichier invalide (du moins c'est ainsi que mon chat se comporte).