Beaucoup de gens utilisent des liners et des scripts contenant du code le long des lignes
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
Le premier cat
est souvent appelé "utilisation inutile de cat" car il nécessite techniquement de démarrer (souvent /usr/bin/cat
) un nouveau processus où cela pourrait être évité si la commande avait été exécutée.
< "$MYFILE" command1 | command2 > "$OUTPUT"
car alors le shell n'a besoin que de démarrer command1
et de simplement pointer son stdin
vers le fichier donné.
Pourquoi le shell ne fait-il pas cette conversion automatiquement? Je pense que la syntaxe "utilisation inutile de chat" est plus facile à lire et que le shell devrait avoir suffisamment d'informations pour se débarrasser automatiquement de chat inutile. Le cat
est défini dans la norme POSIX donc le shell doit être autorisé à l'implémenter en interne au lieu d'utiliser un chemin binaire dans. Le shell peut même contenir une implémentation uniquement pour une seule version d'argument et se replier sur le chemin binaire.
lseek
est toujours défini le comportement et pourrait causer un résultat différent, le comportement différent de blocage peut être sémantiquement significative, etc. Il serait permis de faire le changement si vous saviez ce que les autres commandes étaient et savaient qu'ils ne se soucient pas, ou si vous ne vous souciez pas de la compatibilité à ce niveau, mais l'avantage est assez faible. J'imagine que le manque d'avantages conduit la situation plus que le coût de conformité.
cat
lui-même, ou à tout autre utilitaire. Il est également permis de savoir comment fonctionnent les autres utilitaires appartenant au système (par exemple, il peut savoir comment se comporte l' grep
implémentation externe fournie avec le système ). C'est tout à fait viable à faire, il est donc tout à fait juste de se demander pourquoi ils ne le font pas.
grep
. Et sed
. Et awk
. Et du
. Et combien de centaines sinon de milliers d'autres utilitaires?