Eliah a très bien répondu à cette question, mais je tiens à commenter la partie "pourquoi existe-t-il une autre version de" echo
distinct du programme Bash "? C'est la mauvaise question.
La bonne question est: pourquoi est-ce un processus intégré en premier lieu , alors que cela aurait pu être (et est) une commande externe parfaitement fine?
Pour plus de simplicité, jetez un coup d’œil aux commandes intégrées dans dash, un maigre 38 (bash en a 61, à titre de comparaison, en se basant sur le résultat de compgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
Combien d'entre eux doivent être intégrés? [
, echo
, false
, printf
, pwd
, test
Et true
ne doivent être builtins: Ils ne font rien que seul un builtin peut faire (affecter ou obtenir l' état shell qui n'est pas disponible aux commandes externes). Bash's printf
profite au moins d'être intégré: printf -v var
enregistre le résultat dans la variable var
. time
in bash est également spécial: en étant un mot clé, vous pouvez chronométrer des listes de commandes arbitraires en bash (dash n’a pas d’ time
équivalent). pwd
ne doit pas non plus être intégré - toute commande externe héritera du répertoire de travail actuel (et il s'agit également d'une commande externe ).:
est une exception - vous avez besoin d'un NOP, et :
c'est tout. Les autres font des actions qu'une commande externe peut facilement faire.
Ainsi, un cinquième de ces tâches intégrées n'a pas besoin d'être intégré. Pourquoi alors? La dash
page de manuel * explique en passant pourquoi elles sont intégrées (emphase moi):
Builtins
Cette section répertorie les commandes intégrées qui sont intégrées car elles
besoin d'effectuer une opération qui ne peut pas être effectuée par un séparé
processus. En plus de cela, plusieurs autres commandes peuvent être utilisées.
être intégré pour plus d'efficacité (par exemple, printf (1), echo (1), test (1), etc.).
C'est à peu près tout: ces fonctions intégrées existent, car elles sont utilisées très souvent, de manière interactive et dans des scripts, et leur fonctionnalité est suffisamment simple pour que le shell puisse faire le travail. Et il arrive: certains (?) La plupart des obus ont au travail ** Retour à. Lash
de 2.9 BSD , et vous ne trouverez pas un echo
builtin.
Donc, il est tout à fait possible qu'un shell minimal puisse ignorer l'implémentation de telles commandes en tant que commandes intégrées (je ne pense pas que tout shell actuel le fasse). Le projet GNU coreutils ne suppose pas que vous allez les exécuter dans un shell particulier, et POSIX requiert ces commandes. Donc, coreutils les fournit quand même, et saute ceux qui n’ont aucune signification en dehors de la coquille.
* Ceci est presque identique au texte de la page de manuel correspondant au shell Almquist , sur lequel est basé dash, le shell Debian Almquist.
** zsh
pousse cette idée à l'extrême: les commandes que vous obtenez en chargeant différents modules, par exemple zmv
, sont des choses que vous ne penseriez même pas qu'un shell devrait avoir . A ce stade, la vraie question est: pourquoi voudriez-vous utiliser bash au lieu de zsh, qui a toutes ces fonctions intégrées?