J'ai remarqué qu'il y a un exécutable binaire /bin/echo
sur mon système Ubuntu MATE 17.04.
J'ai pensé, c'est étrange, parce que
$ type echo
echo is a shell builtin
Les tests Cursory suggèrent que cela /bin/echo
fait le même genre de chose que le Bash intégré echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Alors, pourquoi existe-t-il une autre version de echo
distinct du programme Bash, et pourquoi ou quand voudrais-je l'utiliser?
command-line
bash
echo
Zanna
la source
la source
echo
est fourni en tant que shell intégré, tandis que celui-ci demande pourquoi il est fourni en tant que commande externe.Réponses:
Si vous ouvrez une
bash
invite et tapez uneecho
commande, celle-ci utilise un shell intégré plutôt que l'exécution/bin/echo
. Les raisons pour lesquelles il est toujours important/bin/echo
d'exister sont les suivantes:echo
intégrée. Ce n'est pas réellement nécessaire.Pour développer # 1, supposons que vous vouliez déplacer tous les fichiers réguliers dont les noms commencé avec
abc
partout danssrc
ladest
. Il y a plusieurs façons de le faire, mais l'une d'entre elles est:Mais supposons plutôt que de simplement exécuter cela, vous voulez voir chaque commande qui sera exécutée en premier. Eh bien, alors vous pouvez ajouter
echo
une commande à la commande, comme dans d’autres contextes:Mais
find
n'utilise pas de shell. Ça court/bin/echo
.Outre
find
avec-exec
ou-execdir
, l'/bin/echo
exécutable sera appelé par d'autres programmes qui exécutent eux-mêmes des programmes, mais pas à l'aide d'un shell. Cela se produit avec laxargs
commande (qui est liée àfind
), ainsi que dans un certain nombre d'autres contextes, tels que laExec=
ligne d' un.desktop
fichier . Un autre exemple est le moment où vous exécutezsudo echo
, ce qui peut être utile pour tester sisudo
fonctionne.De même, certains coquillages ont un
printf
construit, mais/usr/bin/printf
existe également.Une raison moins courante que vous pourriez utiliser délibérément
/bin/echo
est si vous vous en remettiez aux différences entre celui-ci et laecho
commande fournie par votre shell.man echo
documents/bin/echo
;help echo
dans lesbash
documents thebash
builtin.echo
n’est pas très portable, car différentes implémentations - à la fois d’un système d’exploitation à l’autre et d’un même système d’exploitation - prennent en charge différentes options (par exemple,-e
) et diffèrent dans le traitement des barres obliques inverses . Bien sûr, il vaut mieux éviter de s’appuyer sur de tels détails et utiliser à laprintf
place, qui est beaucoup plus portable .En
bash
, vous pouvez aussi faire letype
show intégré/bin/echo
- en supposant qu'il/bin
est dans votre$PATH
comme il se doit toujours - en lui passant le-a
drapeau :la source
cd
existe un exécutable (qui, lorsqu’il est exécuté, change de répertoire et se ferme en laissant l’appelant là où il se trouvait auparavant) et que certains systèmes d’exploitation en ont un. Il peut être utile de citer 4.1 dans les normes GNU .cd
est simplement un test de capacité à accéder à un répertoire donné: en cas de/usr/bin/cd some/dir
succès, d'un coup, vous avez testé: a) qu'ilsome/dir
existe, b) qu'il s'agit d'un répertoire ou d'un lien vers un, et c) le les autorisations requises pour que vous puissiez accéder à ce répertoire existent; tout cela sans changer votre propre état./bin/echo
non\bin\echo
, sauf si vous utilisez Windows. ;)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
):Combien d'entre eux doivent être intégrés?
[
,echo
,false
,printf
,pwd
,test
Ettrue
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'sprintf
profite au moins d'être intégré:printf -v var
enregistre le résultat dans la variablevar
.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):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 à. La
sh
de 2.9 BSD , et vous ne trouverez pas unecho
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 exemplezmv
, 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?la source
:
car un externe ne serait pas vraiment un NOP, vous auriezPATH
quand même une recherche, une tentative d'exécution de la commande, etc., alors que tout ce que vous voulez vraiment est de ne rien faire expressément.:
comme intégré fait cela.pwd
être intégré pour fonctionner correctement, avec le comportement par défaut consistant à afficher le chemin "logique" (pwd -L
)./bin/pwd
pourrait seulement implémenter lepwd -P
comportement de vous montrer les répertoires parents réels, pas le lien symboliquecd
par lequel vous avez traversé.pwd
Le statut de @PeterCordes est un peu compromis par la présence dePWD
, mais oui, c'est aussi une instance de bash qui utilise le statut intégré pour améliorer la fonctionnalité