Le 19 juillet 2017, à Prague, Mark
Krenz, le fondateur et animateur du fameux compte
Twitter climagic
(Command-Line interface
magic), profitait de ses vacances en Europe pour faire
un exposé
sur la ligne de commande, ses
beautés, et le projet climagic. Ça m'a fait rater la séance
plénière de l'IETF 99
mais ça valait la peine. (Pour ce·ux·lles qui n'étaient pas à Prague,
les pauvres, l'exposé est visible chez Google.)
L'exposé
se tenait à la ČVUT (excellents locaux, vue
magnifique sur la ville
depuis le 14e étage). La grande salle était presque pleine. Comme
on s'en doute, il n'y avait que trois ou quatre femmes.
La thèse centrale de Mark Krenz est que la ligne de
commande n'est pas une survivance du passé, qu'on
garde par habitude, ou par nostalgie. C'est toujours un outil
puissant et efficace pour les professionnels (comme un de ses
enfants lui avait dit une fois, lorsque le réseau était en panne, « open the black window and type text, to fix the
network »). Le concept n'est en outre pas spécifique à Unix,
Mark Krenz a cité l'ARexx
d'Amiga. Une des preuves de
cette pertinence de la ligne de commande est que désormais même
Windows a une ligne de commandes de qualité
raisonnable, Powershell. L'orateur a
ensuite illustré ce
point de vue de nombreux exemples.
Prévoyant que l'unixien moyen était pinailleur, il a
prévenu tout de suite que c'était ses exemples, qu'il y avait
plusieurs façons de faire, et que ce n'était pas la peine de lui
dire que tel exemple aurait pu être fait avec telle autre
méthode. Il a aussi précisé que la référence pour ses tweets était
Linux avec bash
(même s'il teste parfois sur une VM
FreeBSD) et
qu'il ne fallait pas l'embêter avec des « mais c'est pas
portable ». Effectivement, il utilise des exemples comme la
commande interne help
(specifique à bash) ou
comme l'excellente et indispensable option -i
de sed (spécifique à GNU sed).
Mark Krenz (qui travaille au CACR et est l'auteur des
excellents num-utils) a d'abord résumé le projet climagic. Démarré en
2009, il consiste en un compte Twitter (il
y a aussi des
vidéos) où environ la moitié des tweets sont des commandes
Unix. Elles sont en général sous le format
commande # description
(le
croisillon indiquant un commentaire). Par
exemple :
killall -USR1 dd # Force each dd command in the process table to output its current status (blocks written, etc). The USR1 signal does this.
(lisez les documentations de
killall et
dd si nécessaire.) Les autres tweets sont diverses
réflexions, ou des blagues, par exemple sur Chuck
Norris («
Chuck Norris once ran cd .. in / and it worked »).
Ah, et pourquoi le magic dans
« climagic ». Précisement parce que cela n'a rien de magique, tout
peut être appris. « Witchcraft to the ignorant,
simple science for the learned one » (Leigh
Brackett).
La force du shell
Unix est évidemment sa capacité à combiner
des commandes pour faire davantage que ce que ferait chaque
commande individuelle. Donc, lister des commandes et des options,
c'est bien, mais il faut surtout se rappeler qu'on peut les
combiner. Un exemple montré par l'auteur est une commande qui
énonce à voix haute les réseaux Wi-Fi
rencontrés : iwlist wlp2s0 scan | awk -F: '/ESSID/ {print $2}' | sort|uniq | espeak
.
Je ne vais pas citer tous les trucs Unix qu'a montré l'orateur,
uniquement ceux que je ne connaissais pas. Vous pourrez ainsi
juger de la profondeur de mon ignorance d'Unix :
- Je n'utilise pas les opérateurs rigolos après les noms de
variables du shell. Si
ALPHABET
vaut les
lettres de l'alphabet (par exemple en faisant
ALPHABET=$(echo {a..z} | tr -d ' ')
, alors
echo ${ALPHABET:0:3}
affichera les trois
premières, et echo ${ALPHABET^^}
affichera
leurs versions majuscules (bash seulement).
- Je ne connaissais pas certaines variables spéciales comme
SHLVL
(pour voir si on est dans un
sous-shell), ou COLUMNS
(qui était inutile
sur un VT100 mais bien pratique sur un
xterm).
- J'ai découvert qu'après more et
less, il y avait désormais une commande
most (pas mal pour les fichiers binaires).
- column est cool pour formater joliment des
commandes qui ne le font pas elle-même (comme
mount).
- Il y a d'autres commandes que je ne connaissais pas mais
qui ne m'ont pas convaincu comme comm, ou
pee (analogue à tee mais envoie les données
à un processus, pas à un fichier, il se trouve dans
les moreutils).
- Certaines commandes classiques donnent des résultats
inattendus dans certains cas. Par exemple
cal 9
1752
. Si vous vous demandez ce que sont devenus ces
treize jours, ils ont disparu suite à l'application de la
réforme
grégorienne à l'empire
britannique (les pays catholiques l'ont fait
longtemps avant, ce dont on peut déduire qu'Unix n'est pas
catholique). Comme tous les pays n'ont pas adopté cette réforme
au même moment, logiquement, le résultat devrait dépendre de la
valeur de la variable d'environnement
LC_CTIME
mais ce n'est hélas pas le cas.
- Je ne savais pas non plus que la barre
oblique après un joker ne
renvoyait que les répertoires. Parfait pour un
du -sh
*/
(au fait, GNU sort peut trier ces tailles
« human-readables », avec
-h
: du -sh */ | sort -rh | head
-5
permet de voir les cinq plus gros répertoires,
avec un joli affichage des tailles.)
- Parmi les autres options pratiques,
-P
dit à xargs d'effectuer les
commandes en parallèle (comme le -j
de
make). Cela a permis à l'orateur de montrer un
fping refait avec un ping ordinaire,
l'expansion des séquences, et xargs.
Lors de la discussion qui a suivi, j'ai soulevé la question
d'Unicode dans le shell Unix. Certaines
commandes gèrent bien Unicode, par exemple
awk :
% echo -n café | awk '{print length($1)}'
4
Il a bien indiqué la longueur en caractères, pas en octets
(« café » fait cinq octets en
UTF-8).
wc, lui, permet
d'avoir caractères ou octets au choix :
% echo -n café | wc -m
4
% echo -n café | wc -c
5
Cela montre que, même si le shell a la réputation d'être un
vieux truc, il a su s'adapter à la modernité. Mais ce n'est pas le
cas de toutes les commandes Unix. Au moins sur mon
Ubuntu (il parait que ça marche sur
d'autres Unix),
cut semble
insensible à l'internationalisation (il affiche les octets
bêtement, malgré ce que prétend sa documentation) :
% echo caféthé | cut -c 3
f
% echo caféthé | cut -c 4
�
% echo caféthé | cut -c 5
�
% echo caféthé | cut -c 6
De même, l'expansion par le shell ne semble pas marcher avec les
caractères non-ASCII :
% echo {a..c}
a b c
% echo {à..ç}
{à..ç}
(Et, oui, la variable d'environnement
LC_CTYPE
était bien définie, sinon, grep ou
wc n'auraient pas marché.)
M. climagic a évidemment parlé de plein d'autres choses, mais
je les connaissais. Et vous ?
- Il a bien sûr cité
man et ses options. Notez que
man -k
delete
ne trouve pas la commande
rm…
- Il a longuement parlé de nombreux trucs du shell comme les
astuces de la commande cd (
cd
-
vous ramène au dernier répertoire), le job
control (Control-Z, fg
et bg), l'expansion des intervalles (echo
{a..z}
, echo
IMG_{3200..3300}.jpg
, qui permet de faire un
rsync -a -v IMG_{3200..3300}.jpg
server:dir
…, les fonctions (le plus bel exemple était
une redéfinition de cd, pour accepter l'argument
...
pour dire « remonte de deux niveaux » :
function cd(){ [[ "$1" == "..." ]] && builtin
cd ../.. || builtin cd $@}
, la redirection des seules
erreurs (command 2> file
), etc.
- Mark Krenz a évidemment consacré du temps à
awk et sed (tiens,
lui non plus n'a pas l'air de gérer Unicode).
- Et enfin il a parlé de deux programmes géniaux qui
méritent d'être plus connus, ngrep (comme
grep mais pour le réseau), et
socat (netcat en mieux).
Autre discussion à la fin de la réunion, je lui ai demandé pourquoi
ne pas avoir également climagic sur le réseau social décentralisé
Mastodon. Il n'est pas contre (surtout si on peut le faire
depuis la ligne de commande, bien sûr, mais c'est possible avec madonctl), c'est
surtout un problème de manque de temps. (À noter que climagic a existé
sur identi.ca mais que cela ne lui a pas laissé
de bons souvenirs.)
La vue depuis l'université :
Le panneau sur la salle de réunion :