$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Pourquoi ne pas l' écho d' un utilitaire indépendant comme ls
, ps
, cat
etc? Pourquoi est-ce spécifique à la coquille? Des bonnes raisons?
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Pourquoi ne pas l' écho d' un utilitaire indépendant comme ls
, ps
, cat
etc? Pourquoi est-ce spécifique à la coquille? Des bonnes raisons?
echo
plus certainement est un Bash intégré. En fait, il est intégré à toutes les grandes coques modernes.Réponses:
Il y a deux classes de commandes intégrées:
Certaines commandes doivent être intégrées au programme shell lui-même car elles ne peuvent pas fonctionner si elles sont externes.
cd
Il en est un puisque, s'il était externe, il ne pourrait changer que de son propre répertoire. cela ne pourrait pas affecter le répertoire de travail actuel du shell. (Voir aussi: Pourquoi n'estcd
pas un programme? )L'autre classe de commandes est intégrée au shell uniquement pour des raisons d'efficacité.
La page de manuel a une section sur builtins qui mentionne , et comme exemples de commandes dans cette classe.
dash
printf
echo
test
Les systèmes Unix ont toujours inclus des exécutables distincts pour les commandes de cette seconde classe. Ces exécutables distincts sont toujours disponibles sur tous les systèmes Unixy que j'ai utilisés, même s'ils sont également intégrés à chaque shell que vous êtes susceptible d'utiliser. ( POSIX exige en fait que ces exécutables soient présents.)
Je crois avoir
echo
été intégré à la coquille dans AT & T Unix System V version 3.1. Je me base sur des comparaisons de deux éditions différentes de manuels pour les systèmes Unix de la série AT & Ts 3B1 . Quelqu'un a gracieusement numérisé les éditions de 1986 de ces manuels et les a mis en ligne ; ceux-ci correspondent à la version originale de SVR3. Vous pouvez voir que celaecho
ne figure pas dans la liste à la page 523 du Manuel de l'utilisateur d' UNIX System V, volume II , à laquelle vous vous attendriez si la commande était intégrée au shell. Dans mon journal local copie des manuels de SVR3.1 de 1987,echo
est répertorié dans cette section du manuel.Je suis à peu près sûr que ce n'est pas une innovation CSRG de Berkeley qu'AT & T a rapportée à la maison. 4.3BSD est sorti la même année que SVR3, 1986, mais si vous consultez la page de manuel sh.1 de 4.3BSD , vous voyez que cela
echo
ne figure pas dans la liste des commandes intégrées de la section "Commandes spéciales". Si CSRG agissait ainsi, cela nous laisserait vouloir une source documentée pour le prouver.À ce stade, vous vous demandez peut-être si
echo
le shell avait été construit avant SVR3.1 et si ce fait n’avait tout simplement pas été documenté jusque-là. Le dernier code source AT & T Unix pré-SVR3 dont je dispose se trouve dans l’ archive PDP-11 System III , dans laquelle vous trouverez le code source du shell Bourne. Vous ne trouverez pasecho
dans la table de commande intégrée, qui se trouve dans/usr/src/cmd/sh/msg.c
. D'après les horodatages de ce fichier, cela prouve que ceecho
n'était certainement pas dans la coquille en 1980.Trivia
Le même répertoire contient également un fichier appelé
builtin.c
qui ne contient rien sur cette question, mais nous trouvons ce commentaire intéressant:la source
print
commande intégrée de ksh qui est supposée se comporter comme suitecho
. Cette commande est présente dans quelque chose comme AT & T Unix SVR4 2.1 i386 d’ISC.print "\012"
donne le même résultat que l'écho. Je me demande pourquoi ksh avait une impression et non un écho intégré? En tout cas vraiment intéressant.Il y a une troisième raison pour laquelle certaines commandes sont intégrées: elles peuvent être utilisées lorsque l'exécution de commandes externes est impossible.
Parfois, un système devient tellement endommagé que la
ls
commande ne fonctionne pas. Dans certains cas, unecho *
fonctionnera toujours.Un autre exemple (plus important!) Est le suivant
kill
: si un système manque de PID gratuits, il n’est pas possible de s’exécuter/bin/kill
(car il nécessite un PID :-), mais l’intégrationkill
fonctionnera.Btw.,
which
Est une commande externe (du moins elle n'est pas interne dans bash), elle ne peut donc pas lister les commandes internes. Par exemple:la source
ldconfig
si vous ne savez PAS exactement ce que vous faites). De plus, que se passe-t-il si vous supprimez votre partition / bin, ou pire, votre partition / sbin, tout en gardant un shell chargé?ps
commande, vous devez donc rechercher les PID manuellement/proc
.which
soit un alias bash qui s'exécute dealias | /usr/bin/which --read-alias ...
sorte que l'externewhich
puisse identifier des alias (mais pas encore intégrés). Je ne peux pas décider s'il faut considérer cela comme brillant ou pervers.Selon le manuel de référence de Bash , il s'agit de commodité.
Le Guide de script avancé Bash contient une explication plus détaillée:
Notez également qu'il
echo
existe un utilitaire autonome sur certains systèmes. Voici ce que j'ai sur mon système Darwin (MacOSX 10.5.8 - Leopard)echo
est également disponible en version intégrée, mais apparemment, mes scripts utilisent / bin / echo sur mon Mac et utilisent une interface intégrée Bash sur la plupart de mes systèmes Linux et FreeBSD. Mais cela ne semble pas avoir d’importance, car les scripts fonctionnent toujours partout.la source
type
.Pour compléter la réponse de bhm, disons que
/bin
vous avez accidentellement été retiré de votre fichierPATH
. Vous voulez pouvoir leecho $PATH
savoir, non?la source
Bien que la plupart des shells intègrent de
echo
nos jours, GNU CoreUtils en inclut également une implémentation autonome:Il semble que GNU Coreutils ne soit pas installé (la plupart des systèmes d’exploitation de serveur et de bureau basés sur Linux le sont installés par défaut, mais Linux ou un autre système UNIX intégré pourrait utiliser des collections alternatives d’utilitaires shell).
BTW: si vous regardez Busybox , vous verrez cela
ls
,ps
et cecat
sont aussi des commandes intégrées (ou du moins peuvent l'être; il est utilisé pour les systèmes intégrés et tout ce qui n'est pas nécessaire peut être omis).la source
/bin/echo
n'existe pas. Ils montrent simplement que la commande intégrée prime sur toutecho
programme de PATH.Voici la vraie raison pour laquelle
echo
un shell devrait être intégré:Supposons que vous ayez un mot de passe dans
$PASSWORD
. Comment écrivez-vous dans un fichier./password
? Naturellement, la plupart des programmeurs écriraient:Cependant, s'il
echo
n'y avait pas de shell intégré, le mot de passe serait transmis à tous les utilisateurs par le biais d'ps
informations.Bien sûr, si vous voulez être intelligent à ce sujet, vous pouvez trouver un moyen de stocker un mot de passe sans
echo
, peut-être en exploitant une autre fonctionnalité du shell:Cependant, la
echo
ceinture de sécurité est un élément important car le moyen le plus évident de sauvegarder un mot de passe dans un fichier devrait également fonctionner.la source