Eliah a fait un excellent travail pour répondre à cette question, mais je veux faire un commentaire sur le "pourquoi y a-t-il une autre version de echo
séparément de la partie "programme Bash". C'est la mauvaise question.
La bonne question est : Pourquoi est-ce un buildin en premier lieu ? alors qu'il aurait pu s'agir (et s'agit toujours) d'une commande externe parfaitement adaptée ?
Pour simplifier, regardez les buildins dans dash, 38 à peine (bash en a 61, à titre de comparaison, si l'on se fie à la sortie de la commande 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 de ces besoin de pour être des builtins ? [
, echo
, false
, printf
, pwd
, test
et true
Ne le fais pas. besoin de pour être intégrés : Ils ne font rien que seul un builtin peut faire (affecter ou obtenir l'état Shell qui n'est pas disponible pour les commandes externes). Les printf
tire au moins profit du fait qu'il s'agit d'un buildin : printf -v var
enregistre la sortie dans la variable var
. time
en bash est aussi spécial : en étant un mot-clé, vous pouvez chronométrer des listes de commandes arbitraires en bash (dash n'a pas d'icône time
équivalent). pwd
n'a pas besoin d'être un buildin non plus - toute commande externe va hériter du répertoire de travail courant (et c'est un commande externe aussi). :
est une exception - vous avez besoin d'un NOP, et :
c'est ça. Les autres font des actions qu'une commande externe peut facilement faire.
Donc, un cinquième de ces builtins n'ont pas besoin d'être des builtins. Pourquoi, alors ? En dash
page d'accueil * explique en fait en passant pourquoi ce sont des builtins (c'est moi qui souligne) :
Builtins
This section lists the builtin commands which are builtin because they
need to perform some operation that can't be performed by a separate
process. In addition to these, **there are several other commands that may
be builtin for efficiency** (e.g. printf(1), echo(1), test(1), etc).
C'est à peu près tout : ces builtins sont là parce qu'ils sont utilisés si souvent, de manière interactive et dans des scripts, et leur fonctionnalité est assez simple, que le scripts peut faire le travail. Et c'est ce qui s'est passé : certains (la plupart ?) shells ont fait le travail. le site sh
de 2.9 BSD et vous ne trouverez pas de echo
builtin.
Ainsi, il est tout à fait possible qu'un Shell minimal puisse ignorer l'implémentation de telles commandes en tant que builtins (je ne pense pas qu'un Shell actuel le fasse, cependant). Le projet GNU coreutils ne suppose pas que vous allez les exécuter dans un Shell particulier, et POSIX requiert ces commandes. Ainsi, coreutils les fournit de toute façon, et saute celles qui n'ont pas de signification en dehors du Shell.
* C'est presque identique à le texte de la page de manuel correspondant au Shell d'Almquist qui est la base de dash, le Shell de Debian Almquist.
** zsh
pousse cette idée à l'extrême : les commandes que vous obtenez en chargeant différents modules, comme zmv
, sont des choses que vous ne penseriez pas qu'un Shell ait besoin de faire. . A ce moment-là, la vraie question est : pourquoi utiliser bash au lieu de zsh, qui a tous ces modules intégrés ?