Commandes internes et externes

TerminalVoici le deuxième volet de mon cours d’introduction au shell Bash. Après avoir vu l’historique du shell, nous abordons aujourd’hui la différence entre les commandes externes et les commandes internes.

Une commande Linux appartient à l’une des deux catégories suivantes.

  1. commandes externes
  2. commandes internes

Les commandes externes

Une commande externe est un fichier localisé dans l’arborescence. Par exemple, lorsqu’un utilisateur lance la commande ls, le shell demande au noyau Linux de charger en mémoire le fichier /bin/ls.

Sont considérées comme commandes externes les fichiers possédant l’un des formats suivants.

  • fichiers au format binaire exécutable
  • fichiers au format texte représentant un script de commandes

La commande file donne une indication sur le type de données contenues dans un fichier. L’argument de la commande file est un nom de fichier exprimé en relatif ou en absolu. Voici deux exemples.

La commande ls est un fichier au format binaire exécutable.

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=3d705971a4c4544545cb78fd890d27bf792af6d4, stripped

La commande gettext.sh est un script shell.

$ file /usr/bin/gettext.sh
/usr/bin/gettext.sh: POSIX shell script, ASCII text executable

Les commandes internes

Une commande interne est intégrée au processus shell. Elle ne correspond donc en aucun cas à un fichier sur le disque.

La commande type indique si une commande possède une implémentation interne. Elle prend en argument le nom d’une commande. Si cette dernière n’est pas interne, elle est recherchée dans les répertoires cités dans PATH. Voici deux exemples.

La commande cd est une commande interne.

$ type cd
cd est une primitive du shell

La commande ls est une commande externe.

$ type -a ls
ls est un alias vers « ls --color=auto »
ls est /usr/bin/ls
ls est /bin/ls

Ici on invoque l’option -a pour afficher les infos sur l’ensemble des exécutables nommés ls. Pour plus d’infos, voir man bash.

Implémentation interne et externe

Certaines commandes ont une implémentation interne et une implémentation externe. Dans ce cas, la commande interne est lancée en priorité. L’exécution d’une commande interne est plus rapide que l’exécution d’une commande externe.

La commande pwd est une commande interne au shell.

$ type pwd
pwd est une primitive du shell

Elle possède également une implémentation externe.

$ type -a pwd
pwd est une primitive du shell
pwd est /usr/bin/pwd
pwd est /bin/pwd

C’est la commande interne qui est exécutée en priorité.

$ pwd
/home/kikinovak

Pour forcer l’exécution de la commande externe, il faut indiquer explicitement l’emplacement de la commande, en absolu ou en relatif.

$ /usr/bin/pwd 
/home/kikinovak
$ cd /usr/bin/
$ ./pwd 
/usr/bin

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 23 – 26
  • Carl Albing – Bash Cookbook, pp. 13 – 14

Lire la suite : L’affichage à l’écran

Ce contenu a été publié dans Bash, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Commandes internes et externes

  1. Ping : Commandes internes et externes - My Tiny Tools

  2. Koocotte dit :

    > fichiers au format binaire exécutable
    > fichiers au format texte représentant un script de commandes

    C’était effectivement le cas aux début de Linux et sur les vieux Unix; mais les choses ont changés:

    Une commande externe est un fichier exécutable (bit x positionné) qui est reconnu par le kernel. Le kernel peut être configuré pour exécuté différents types d’exécutables.

    Généralement il sait exécuter:
    Les binaires au format ELF
    Les scripts commençant par un shebang

    On note qu’une série de commande dans un fichier n’est pas une commande externe; heureusement les shells sont généralement suffisamment malin pour s’en sortir quand même. Dans ce cas, il ne s’agit pas d’une commande, le kernel est incapable de l’exécuter.

    On peut configurer le kernel linux pour reconnaitre les exécutables de type ‘jar’, ‘exe windows’… C’est librement configurable; on pourrait imaginer de rendre exécutable un service systemd si on lui dit comment faire.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.