Pourquoi y a-t-il un / bin / echo et pourquoi voudrais-je l'utiliser?

49

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, parce que

$ type echo
echo is a shell builtin

Des tests poussés suggèrent que /bin/echo fait la même 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 distincte du programme Bash, et pourquoi ou quand voudrais-je l'utiliser?

    
posée Zanna 30.09.2017 - 17:46
la source

2 réponses

86

Si vous ouvrez une invite bash et tapez un Commande echo , qui utilise un shell intégré au lieu d'exécuter /bin/echo . Les raisons pour lesquelles il est toujours important que /bin/echo existe sont les suivantes:

  1. Vous n'utilisez pas toujours un shell. Dans diverses circonstances, vous exécutez un exécutable directement et non via un shell.
  2. Au moins en théorie, certains shells n'ont pas intégré echo . Ce n'est pas réellement nécessaire.

Pour développer le n ° 1, supposons que vous souhaitiez déplacer tous les fichiers normaux dont le nom commençait par abc n'importe où dans src vers dest . Il y a 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, plutôt que de simplement exécuter cela, vous voulez voir chaque commande qui sera exécutée en premier. Eh bien, vous pouvez alors ajouter echo à la commande, comme dans d’autres contextes:

find src -name 'abc*' -type f -exec echo mv -nv {} dest/ \;

Mais find n'utilise pas de shell. Cela fonctionne /bin/echo .

Outre 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. Ceci se produit avec le xargs (qui est liée à find ) , ainsi que dans plusieurs autres contextes, tels que Exec= line sur un fichier .desktop . Un autre exemple est le cas où vous exécutez sudo echo , ce qui peut être pratique pour tester si sudo fonctionne.

De même, certains shells ont un printf intégré mais il existe aussi /usr/bin/printf .

Une raison moins courante que vous pourriez utiliser délibérément /bin/echo est si vous vous basez sur les différences entre celui-ci et la commande echo fournie par votre shell. man echo documents /bin/echo ; help echo sur bash documente le fichier intégré bash . echo n'est pas très portable, car différentes implémentations - à la fois entre systèmes d'exploitation et entre shells sur le même système d'exploitation - prend en charge différentes options (par exemple, -e ) et différentes dans le traitement des barres obliques inverses . Bien sûr, il vaut mieux éviter de s’appuyer sur de tels détails et utiliser printf Au lieu de cela, bien plus portable .

Dans bash , vous pouvez également afficher le programme intégré type /bin/echo - en supposant que /bin se trouve dans votre $PATH comme il se doit - par en lui passant le -a flag :

$ type -a echo
echo is a shell builtin
echo is /bin/echo
    
réponse donnée Eliah Kagan 30.09.2017 - 17:55
la source
31

Eliah a très bien répondu à cette question, mais je voudrais commenter la partie "pourquoi existe-t-il une autre version de echo distincte du programme Bash"? C'est la mauvaise question.

La bonne question à se poser est la suivante: pourquoi cette fonction est-elle intégrée à l'origine , alors qu'elle aurait pu l'être ( et est) une commande externe parfaitement fine?

Par souci de simplicité, jetez un coup d’œil aux commandes intégrées dans le tableau de bord, 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 de ces doivent-ils être intégrés? [ , echo , false , printf , pwd , test et true n'ont pas besoin d'être intégrés: ils ne font rien seule une commande interne peut faire (affecter ou obtenir un état de shell non disponible pour les commandes externes). Bash's printf au moins profite d'être intégré: printf -v var enregistre la sortie 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 dans bash (le tiret n'a pas d'équivalent time ). pwd n'a pas non plus besoin d'être intégré - toute commande externe héritera du répertoire de travail actuel (il s'agit d'un commande externe également). : est une exception - vous avez besoin d'un NOP, et : l'est. Les autres font des actions qu'une commande externe peut facilement faire.

Ainsi, un cinquième de ces éléments intégrés n'a pas besoin d'être intégré. Pourquoi alors? La page de manuel dash * explique en passant pourquoi elles sont intégrées (emphase le mien):

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 fonctions intégrées existent parce qu’elles sont utilisées si souvent, de manière interactive et dans des scripts, et que leurs fonctionnalités sont assez simples pour que le shell puisse faire le travail. Et il en est ainsi: certains (la plupart?) Des obus ont pris le travail. ** Retournez à le sh de 2.9 BSD , et vous ne trouverez pas un echo intégré.

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 ignore ceux qui n’ont aucune signification en dehors de la coquille.

* Ceci est presque identique à le texte de la page de manuel correspondant au shell Almquist , sur lequel est basé le tiret, le shell Debian Almquist.

** zsh prend cette idée à l'extrême: les commandes que vous obtenez en chargeant divers modules, comme zmv , sont des choses que vous ne penseriez pas qu'un shell devrait même entrer dans . À ce stade, la vraie question est la suivante: pourquoi voudriez-vous utiliser bash au lieu de zsh, qui possède toutes ces fonctions intégrées?

    
réponse donnée muru 30.09.2017 - 22:19
la source

Lire d'autres questions sur les étiquettes