Le rapport tapé chaque lundi
Une boutique vous envoie chaque semaine un fichier de visites. Chaque lundi, vous tapez les mêmes trois commandes pour trouver le jour le plus chargé.
Un lundi, vous vous trompez en les tapant et vous envoyez le mauvais jour à votre responsable.
Un bon technicien écrit la tâche une fois, la range dans un fichier et lance le fichier.
À la fin de cette leçon
Remarque
Je peux écrire et lancer un petit script shell, et dire de quel paquet vient un programme.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Script | des commandes rangées dans un fichier, pour les relancer à volonté | |
| Shebang | la première ligne d’un script, qui nomme le programme chargé de le lire | #!/bin/bash |
| Argument | un mot tapé après une commande, que la commande peut utiliser | $1 |
| Code de retour | un nombre laissé par une commande : 0 veut dire qu’elle a réussi | $? |
| Paquet | un programme et ses fichiers, réunis pour que le système puisse l’installer | |
| Gestionnaire de paquets | l’outil qui installe, met à jour et retire les paquets | apt |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un tube répond à une question
Le labo garde un petit fichier de visites dans /srv/lab-web/report.csv. Chaque ligne donne un jour, une virgule et un nombre. Le fichier est en anglais.
cut -d, -f1 garde la première colonne. -d, dit que les colonnes sont séparées par des virgules. tail -n +2 saute la ligne de titre. sort -t, -k2 -n -r trie sur la deuxième colonne, comme des nombres, du plus grand au plus petit. head -n 1 garde la première ligne.
Extraire la première colonne
cut -d, -f1 /srv/lab-web/report.csvAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Trouver le jour le plus chargé
tail -n +2 /srv/lab-web/report.csv | sort -t, -k2 -n -r | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup croient que sort trie les nombres par taille. Par défaut, il trie comme du texte : 98 vient après 175, car 9 vient après 1. Sans -n, le tube ci-dessus affiche Tuesday,98. Ajoutez -n dès que la colonne contient des nombres.
Un script : des commandes dans un fichier
Un script est un fichier texte de commandes. Le shell les exécute de haut en bas, comme si vous les tapiez.
La première ligne est le shebang. Il nomme le programme qui lit le fichier. Une ligne qui commence par # est un commentaire, que le shell saute.
Dans un script, $1 désigne le premier mot tapé après son nom. Le script marche donc sur n’importe quel fichier.
Écrire le script dans un fichier
printf '#!/bin/bash\n# Affiche le jour le plus chargé d’un fichier CSV.\ntail -n +2 "$1" | sort -t, -k2 -n -r | head -n 1\n' > meilleur.shAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Essayer de le lancer
./meilleur.sh /srv/lab-web/report.csvAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demander à bash de le lire
bash meilleur.sh /srv/lab-web/report.csvAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Autoriser le lancement
chmod +x meilleur.shAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le lancer
./meilleur.sh /srv/lab-web/report.csvAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Chaque commande laisse un code de retour
Quand une commande se termine, elle laisse un nombre. 0 veut dire qu’elle a réussi. Tout autre nombre signale un problème.
$? contient le nombre laissé par la dernière commande. Les scripts et cron s’en servent pour savoir si une tâche a réussi.
Une commande qui échoue
ls /nothere ; echo "code $?"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le script qui marche
./meilleur.sh /srv/lab-web/report.csv ; echo "code $?"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup croient qu’un fichier que cat sait afficher se lancera aussi. Lire et lancer sont deux droits différents. Un nouveau fichier n’a le x pour personne. Tapez d’abord chmod +x, ou demandez à bash de le lire.
Les logiciels arrivent en paquets
Sur Ubuntu, un programme arrive sous forme de paquet. Le gestionnaire de paquets garde la liste de ce qui est installé et du paquet qui possède chaque fichier.
dpkg lit cette liste. apt installe depuis internet et demande sudo. Avec -s, apt-get install fait seulement semblant : on peut l’essayer sans risque.
Où est le programme ?
command -v curlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Quel paquet possède ce fichier ?
dpkg -S /usr/bin/curlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le paquet est-il installé ?
dpkg -s curl | grep -E "^(Package|Status)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Faire semblant de le réinstaller
apt-get install -s curl 2>&1 | tail -n 3Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : les verbes d’apt
| Vous tapez | Ce que ça fait | Faut-il sudo ? |
|---|---|---|
| sudo apt update | Met à jour la liste de ce qu’on peut installer | Oui |
| sudo apt install htop | Installe un paquet et ce dont il a besoin | Oui |
| sudo apt remove htop | Retire le paquet | Oui |
| apt-get install -s htop | Montre ce qu’une installation ferait, sans rien changer | Non |
| dpkg -S /usr/bin/curl | Nomme le paquet qui possède un fichier | Non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pour aller plus loin
Tapez ces commandes vous-même. Modifiez le script pour qu’il affiche le jour le plus calme. Quelle option retirez-vous ou ajoutez-vous ?
Trouvez ensuite l’heure cron qui lancerait meilleur.sh à 07 h 30 chaque lundi. Sur un serveur, vous mettriez cette ligne dans /etc/cron.d, avec l’utilisateur avant la commande.