human
J'ai remarqué qu'il y a un exécutable binaire ```/bin/echo``` sur mon système Ubuntu MATE 17.04.
Je pensais, c'est étrange, car
```$ type echo
echo est une commande intégrée du shell```
Des tests sommaires suggèrent que ```/bin/echo``` fait la même chose que la commande intégrée ```echo``` de Bash:
```$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
```
Alors, pourquoi y a-t-il une autre version de ```echo``` séparée du programme Bash, et pourquoi ou quand voudrais-je l'utiliser
gpt
Si vous ouvrez une invite de commande ```bash``` et tapez une commande ```echo```, cela utilise une commande intégrée du shell plutôt que d'exécuter ```/bin/echo```. Les raisons pour lesquelles il est toujours important que ```/bin/echo``` existe sont les suivantes:

* Vous n'utilisez pas toujours un shell. Dans diverses circonstances, vous exécutez directement un exécutable sans passer par un shell.
* Au moins en théorie, certains shells n'ont pas de commande intégrée ```echo```. Ce n'est pas réellement requis.

Pour développer le point #1, supposons que vous vouliez déplacer tous les fichiers réguliers dont les noms commencent par ```abc``` dans n'importe quel endroit de ```src``` vers ```dest```. Il existe plusieurs façons de le faire, mais l'une d'entre elles est:
```find src -name 'abc*' -type f -exec mv -nv {} dest/ \;
```
Mais supposons que, plutôt que de simplement l'exécuter, vous vouliez voir chaque commande qui sera exécutée au préalable. Eh bien, vous pouvez préfixer la commande avec ```echo```, tout comme vous le feriez dans d'autres contextes:
```find src -name 'abc*' -type f -exec echo mv -nv {} dest/ \;
```
Mais ```find``` n'utilise pas de shell. Cela exécute ```/bin/echo```.
En plus de ```find``` avec ```-exec``` ou ```-execdir```, l'exécutable ```/bin/echo``` sera appelé par d'autres programmes qui exécutent eux-mêmes des programmes mais pas via un shell. Cela se produit avec la commande ```xargs``` (qui est liée à ```find```), ainsi que dans de nombreux autres contextes, tels que la ligne ```Exec=``` d'un fichier ```.desktop```. Un autre exemple est lorsque vous exécutez ```sudo echo```, ce qui peut être pratique pour tester si ```sudo``` fonctionne.
De même, certains shells ont une commande intégrée ```printf``` mais ```/usr/bin/printf``` existe également.
Une raison moins courante pour laquelle vous pourriez délibérément utiliser ```/bin/echo``` est si vous comptiez sur les différences entre celui-ci et la commande ```echo``` fournie par votre shell. ```man echo``` documente ```/bin/echo```; ```help echo``` dans ```bash``` documente la commande intégrée ```bash```. ```echo``` n'est pas très portable, car différentes implémentations - à la fois entre les systèmes d'exploitation et entre les shells sur le même système d'exploitation - prennent en charge différentes options (par exemple, ```-e```) et diffèrent dans leur traitement des barres obliques inverses. Bien sûr, il est préférable d'éviter de compter sur de tels détails et d'utiliser plutôt ```printf```, qui est beaucoup plus portable.
Dans ```bash```, vous pouvez faire en sorte que la commande intégrée ```type``` affiche également ```/bin/echo``` - en supposant que ```/bin``` est dans votre ```$PATH``` comme il se doit toujours - en lui passant le drapeau ```-a```:
```$ type -a echo
echo est une commande intégrée du shell
echo est /bin/echo
```