Type, lancement et origine d'une commande

Mise à jour : Debian 10.3 / Buster

Ce document décrit les différents types de commande utilisables dans le shell et le moyen de les lancer.

Références

Sommaire

1 - Type et liste des commandes

Une liste de toutes les commandes prises en charge par le shell est fournie par la commande compgen avec l'option -c pour "all commands":

# Liste des 10 premières commandes par ordre alphabétique

$ compgen -c |sort |uniq |head
!
.
:
[
[[
]]
{
}
2to3-2.7
411toppm

# Liste des 10 ernières commandes par ordre alphabétique
$ compgen -c |sort |uniq |tail
zip
zipcloak
zipdetails
zipgrep
zipinfo
zipnote
zipsplit
zless
zmore
znew

Elles peuvent être classées en 5 types :

$ compgen -b         # Option -b builtin

$ type cd
cd est une primitive du shell
$ compgen -k # Option -k keywords

$ type if
if est un mot-clé du shell
$ compgen - c                # Liste des commandes


$ type apt # Commandes accessibles avec les droits utilisateurs
apt est /usr/bin/apt

$ su -l -c 'type blkid' # Commandes accessibles avec les droits privilégiés seulement
Mot de passe :
blkid est /usr/sbin/blkid
$ compgen -A function  # Liste des fonctions

$ type quote
quote est une fonction
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
$ compgen -a # Option -a alias

$ type ls
ls est un alias vers « ls --color=auto »

2 - Lancement d'une commande

2.1 - Primitives du shell

$ type cd
cd est une primitive du shell

$ which cd

$ cd test

2.2 - Commandes exécutables

$ /usr/bin/cat test
$ cat test
$ printenv PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ echo 'PATH=$PATH:$HOME/script' >> ~/.bashrc
$ echo 'PATH=$HOME/script:$PATH:' >> ~/.bashrc

3 - Origine des programmes fournis par des fichiers

Lorsque les programmes sont fournis par des fichiers installés par des paquets, il est possible de trouver le nom du paquet à l'aide de l'option -L de la commande dpkg

On peut distinguer

$ type cut
cut est /usr/bin/cut

$ dpkg -S /usr/bin/cut
coreutils: /usr/bin/cut
$ type sed
sed est /usr/bin/sed

$ dpkg -S /bin/sed # A partir de Debian 10, /bin est un lien vers /usr/bin
sed: /bin/sed
$ type dmesg
dmesg est /usr/bin/dmesg

$ dpkg -S /bin/dmesg # A partir de Debian 10, /bin est un lien vers /usr/bin util-linux: /bin/dmesg
$ su -l -c 'type blkid'
Mot de passe :
blkid est /usr/sbin/blkid

$ dpkg -S /sbin/blkid # A partir de Debian 10, /bin est un lien vers /usr/bin util-linux: /sbin/blkid

4 - Divers

$ type ls
ls est un alias vers « ls --color=auto »

$ unalias ls

$ type ls
ls est/usr/bin/ls
$ dpkg -S /bin/ls # A partir de Debian 10, /bin est un lien vers /usr/bin coreutils: /bin/ls
$ type touch
touch est haché (/usr/bin/touch)

ce qui signifie que le chemin vers la commande (/usr/bin/touch dans l'exemple ci-dessus) a été mémorisé par bash pour accélérer le lancement de la commande. La liste des commandes hachées peut-être affichée avec la commande hash

$ hash -l
$ hash -l
builtin hash -p /usr/bin/aptitude aptitude
builtin hash -p /usr/bin/dpkg dpkg
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/locate locate
builtin hash -p /usr/bin/ls ls

Chaque session bash possède sa propre liste, initialement vide au début de la session, puis complétée au fur et à mesure par les commandes passées dans la session