Commandes et opérateurs Bash
Chaque langage de shell a des commandes phares. Commençons par générer votre répertoire Bash en examinant les commandes les plus couramment utilisées.
Commandes Bash
Examinons les commandes Bash courantes et voyons comment les utiliser.
Commande ls
ls
liste le contenu de votre répertoire actif ou du répertoire spécifié dans un argument à la commande. Utilisée seule, elle liste les fichiers et répertoires du répertoire actif :
ls
Les fichiers et répertoires dont le nom commence par un point sont masqués par défaut. Pour inclure ces éléments dans une liste de répertoires, utilisez un indicateur -a
:
ls -a
Pour obtenir davantage d’informations sur les fichiers et répertoires du répertoire actif, utilisez un indicateur -l
:
ls -l
Voici un exemple de sortie d’un répertoire contenant quelques fichiers JPEG et PNG ainsi qu’un sous-répertoire nommé gifs :
-rw-rw-r-- 1 azureuser azureuser 473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser 473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser 423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser 4096 Jun 13 20:16 gifs
Chaque ligne fournit des informations détaillées sur le fichier ou le répertoire correspondant. Ces informations incluent les autorisations qui lui sont attribuées, son propriétaire, sa taille en octets, la dernière fois qu’il a été modifié et le nom du fichier ou du répertoire.
Commande cat
Supposons que vous souhaitiez voir ce qui se trouve à l’intérieur d’un fichier. Vous pouvez utiliser la commande cat
pour cela. La sortie n’a de sens que si le fichier est un fichier texte. La commande suivante montre le contenu du fichier os-release stocké dans le répertoire /etc :
cat /etc/os-release
Cette commande est utile car elle indique la distribution de Linux que vous exécutez :
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Le répertoire /etc est un répertoire spécial dans Linux. Il contient les fichiers de la configuration système. Ne supprimez aucun fichier de ce répertoire, sauf si vous savez pertinemment ce que vous faites.
Commande sudo
Certaines commandes Bash peuvent uniquement être exécutées par l’utilisateur racine, c’est-à-dire un administrateur système ou un superutilisateur. Si vous essayez d’exécuter l’une de ces commandes avec des privilèges insuffisants, elle échoue. Par exemple, seuls les utilisateurs connectés en tant que superutilisateurs peuvent utiliser cat
pour voir le contenu de /etc/at.deny :
cat /etc/at.deny
at.deny est un fichier spécial qui détermine qui peut utiliser d’autres commandes Bash pour envoyer des travaux à exécuter ultérieurement.
La plupart du temps, il est déconseillé d’exécuter du code en tant qu’utilisateur racine, car cela est dangereux. Si vous souhaitez exécuter des commandes qui nécessitent des privilèges administratifs sans vous connecter en tant que superutilisateur, faites précéder les commandes avec sudo
:
sudo cat /etc/at.deny
sudo
signifie « superuser do ». Quand vous l’utilisez, vous indiquez au shell que vous agissez avec le niveau d’autorisation de l’utilisateur root pour cette commande particulière.
Commandes cd
, mkdir
et rmdir
cd
signifie « change directory ». Cette commande fait exactement ce que son nom suggère : elle remplace le répertoire actif par un autre répertoire. Vous pouvez ainsi passer d’un répertoire à un autre, comme avec son équivalent dans Windows. La commande suivante passe à un sous-répertoire du répertoire actif nommé orders :
cd orders
Pour monter d’un répertoire, spécifiez ..
comme nom de répertoire :
cd ..
Cette commande bascule vers votre répertoire de base, c’est-à-dire celui dans lequel vous arrivez quand vous vous connectez pour la première fois :
cd ~
Vous pouvez créer des répertoires à l’aide de la commande mkdir
. La commande suivante crée un sous-répertoire nommé orders dans le répertoire de travail actif :
mkdir orders
Si vous souhaitez créer un sous-répertoire et un autre sous-répertoire sous celui-ci avec une seule commande, utilisez l’indicateur --parents
:
mkdir --parents orders/2019
La commande rmdir
supprime un répertoire, mais seulement s’il est vide. S’il n’est pas vide, vous recevrez un avertissement. Heureusement, vous pouvez utiliser la commande rm
pour supprimer des répertoires qui ne sont pas vides en la combinant avec l’indicateur -r
(récursif). La commande se présente alors comme suit : rm -r
.
Commande rm
La commande rm
est l’abréviation de « remove ». Comme vous vous en doutez, rm
supprime des fichiers. Cette commande met donc fin à 0001.jpg :
rm 0001.jpg
Cette commande supprime tous les fichiers du répertoire actif :
rm *
Méfiez-vous de rm
. C’est une commande dangereuse.
Pour prendre le temps de réfléchir, exécutez rm
avec l’indicateur -i
:
rm -i *
Prenez l’habitude d’inclure -i
dans chaque commande rm
pour ne pas être la victime de l’un des plus gros défauts de Linux. La redoutable commande rm -rf /
supprime tous les fichiers d’un lecteur. Elle supprime de manière récursive tous les sous-répertoires de la racine et leurs sous-répertoires. L’indicateur -f
(qui signifie « force ») ne fait qu’aggraver le problème en supprimant les invites. Ne faites pas ça.
Si vous souhaitez supprimer un sous-répertoire nommé orders qui n’est pas vide, vous pouvez utiliser la commande rm
de cette façon :
rm -r orders
Cette commande supprime le sous-répertoire orders et tout ce qu’il contient, y compris les autres sous-répertoires.
Commande cp
La commande cp
copie non seulement des fichiers, mais également des répertoires entiers (et leurs sous-répertoires) si vous le souhaitez. Pour effectuer une copie de 0001.jpg nommée 0002.jpg, utilisez la commande suivante :
cp 0001.jpg 0002.jpg
Si le fichier 0002.jpg existe déjà, Bash le remplace silencieusement. C’est parfait si c’est ce que vouliez faire, un peu moins si vous ne saviez pas que l’ancienne version allait être remplacée.
Heureusement, si vous utilisez l’indicateur -i
(qui signifie « interactive »), Bash vous avertit avant de supprimer des fichiers existants. Ceci est plus sûr :
cp -i 0001.jpg 0002.jpg
Vous pouvez utiliser des caractères génériques pour copier plusieurs fichiers à la fois. Pour copier tous les fichiers du répertoire actif dans un sous-répertoire nommé photos, procédez comme suit :
cp * photos
Pour copier tous les fichiers d’un sous-répertoire nommé photos dans un sous-répertoire nommé images, procédez comme suit :
cp photos/* images
Cela suppose que le répertoire images existe déjà. Si ce n’est pas le cas, vous pouvez le créer et copier le contenu du répertoire photos avec cette commande :
cp -r photos images
Le -r
signifie « recursive ». L’indicateur -r
présente un autre avantage : si photos contient des sous-répertoires, ces derniers sont également copiés dans le répertoire images.
Commande ps
La commande ps
vous donne un instantané de tous les processus en cours d’exécution. Lorsqu’elle est utilisée seule et sans arguments, elle affiche tous vos processus shell (en d’autres termes, pas grand-chose). Il en va autrement quand vous incluez un indicateur -e
:
ps -e
-e
liste tous les processus en cours d’exécution (il y en a généralement beaucoup).
Pour obtenir une vue plus complète des processus en cours d’exécution dans le système, utilisez l’indicateur -ef
:
ps -ef
Cet indicateur montre les noms de tous les processus en cours d’exécution, leur numéro d’identification de processus (PID), les PID de leurs parents (PPID) et l’heure de démarrage (STIME). Il montre également le terminal, le cas échéant, auquel ils sont attachés (TTY), le temps processeur qu’ils ont accumulé (TIME) et leur nom de chemin complet. Voici un exemple abrégé :
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:35 ? 00:00:03 /sbin/init
root 2 0 0 13:35 ? 00:00:00 [kthreadd]
root 3 2 0 13:35 ? 00:00:00 [rcu_gp]
root 4 2 0 13:35 ? 00:00:00 [rcu_par_gp]
root 5 2 0 13:35 ? 00:00:00 [kworker/0:0-cgr]
root 6 2 0 13:35 ? 00:00:00 [kworker/0:0H-kb]
root 8 2 0 13:35 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 13:35 ? 00:00:01 [ksoftirqd/0]
root 10 2 0 13:35 ? 00:00:02 [rcu_sched]
À titre de renseignement, il se peut que vous trouviez de la documentation montrant ps
utilisé de cette façon :
ps aux
ps aux
et ps -ef
sont identiques. Cette dualité remonte aux différences historiques entre les systèmes Unix POSIX (dont Linux fait partie) et les systèmes Unix BSD (dont le plus courant est macOS). Au début, POSIX utilisait -ef
alors que BSD nécessitait aux
. Aujourd’hui, les deux familles de systèmes d’exploitation acceptent les deux formats.
Voilà qui nous rappelle l’importance d’examiner attentivement le manuel pour toutes les commandes Linux. Apprendre Bash, c’est comme apprendre le français en seconde langue. Chaque règle compte de nombreuses exceptions.
Commande w
Les utilisateurs vont et viennent, et vous pouvez parfois vous retrouver avec des utilisateurs indésirables. Quand un employé quitte une entreprise pour d’autres fonctions, l’administrateur système doit vérifier qu’il ne peut plus se connecter aux systèmes informatiques de l’entreprise. Les administrateurs système sont également censés savoir qui est connecté, et qui ne doit pas l’être.
Pour savoir qui se trouve sur vos serveurs, Linux fournit la commande w
(qui signifie « who »). Elle donne des informations sur les utilisateurs actuellement présents sur le système informatique et leurs activités. w
montre les noms des utilisateurs, leurs adresses IP, l’heure à laquelle ils se sont connectés, les processus en cours d’exécution et le temps consommé par ces processus. Il s’agit d’un outil précieux pour les administrateurs système.
Opérateurs d’E/S Bash
Vous pouvez accomplir beaucoup de choses dans Linux en utilisant simplement des commandes Bash et leurs nombreuses options. Mais vous pouvez vraiment accroître votre productivité en combinant des commandes à l’aide des opérateurs d’E/S :
<
: redirige l’entrée vers une source autre que le clavier>
: redirige la sortie vers une destination autre que l’écran>>
: effectue la même chose, mais en ajoutant plutôt qu’en remplaçant|
: envoie la sortie d’une commande à l’entrée d’une autre commande dans le pipeline
Supposons que vous souhaitiez tout lister dans le répertoire actif et capturer la sortie dans un fichier nommé listing.txt. C’est ce que fait la commande suivante :
ls > listing.txt
Si listing.txt existe déjà, il est remplacé. Si vous utilisez l’opérateur >>
à la place, la sortie de ls
est ajoutée à ce qui se trouve déjà dans listing.txt :
ls >> listing.txt
L’opérateur de canalisation est puissant (et souvent utilisé). Il transmet la sortie de la première commande à l’entrée de la deuxième commande. Supposons que vous utilisiez cat
pour afficher le contenu d’un fichier volumineux, mais que ce contenu défile trop rapidement pour que vous puissiez le lire. Vous pouvez rendre la sortie plus facile à gérer en envoyant les résultats à une autre commande telle que more
à l’aide du pipe. La commande suivante liste tous les processus en cours d’exécution. Mais une fois que l’écran est plein, la sortie s’interrompt jusqu’à ce que vous sélectionniez Entrée pour afficher la ligne suivante :
ps -ef | more
Vous pouvez également envoyer la sortie à head
à l’aide du pipe pour voir uniquement les premières lignes :
ps -ef | head
Imaginons que vous souhaitez filtrer la sortie pour inclure uniquement les lignes contenant le mot « daemon ». Une façon d’y parvenir consiste à envoyer la sortie de ps
à l’outil grep
de Linux à l’aide du pipe :
ps -ef | grep daemon
La sortie peut ressembler à ceci :
azureus+ 52463 50702 0 23:28 pts/0 00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root 449 1 0 13:35 ? 00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root 988 1 0 13:35 ? 00:00:00 /usr/lib/accountsservice/accounts-daemon
message+ 1002 1 0 13:35 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon 1035 1 0 13:35 ? 00:00:00 /usr/sbin/atd -f
root 1037 1 0 13:35 ? 00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root 1039 1 0 13:35 ? 00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+ 52477 50702 0 23:28 pts/0 00:00:00 grep --color=auto daemon
Vous pouvez également utiliser des fichiers en entrée. Par défaut, l’entrée standard provient du clavier, mais vous pouvez également la rediriger. Pour obtenir une entrée à partir d’un fichier au lieu du clavier, utilisez l’opérateur <
. Une tâche courante pour un administrateur système consiste à trier le contenu d’un fichier. Comme son nom l’indique, sort
trie le texte par ordre alphabétique :
sort < file.txt
Pour enregistrer les résultats triés dans un nouveau fichier, vous pouvez rediriger l’entrée et la sortie :
sort < file.txt > sorted_file.txt
Vous pouvez utiliser des opérateurs d’E/S pour enchaîner des commandes Linux selon les besoins. Prenez la commande suivante :
cat file.txt | fmt | pr | lpr
La sortie de cat
est envoyée à fmt
, la sortie de fmt
à pr
, et ainsi de suite. fmt
met en forme les résultats dans un paragraphe ordonné. pr
pagine les résultats. Et lpr
envoie la sortie paginée à l’imprimante. Tout ceci en une seule ligne !