Voici 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.
- commandes externes
- 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
Ping : Commandes internes et externes - My Tiny Tools
> 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.