Première rédaction de cet article le 20 juillet 2017
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 :
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).SHLVL
(pour voir si on est dans un
sous-shell), ou COLUMNS
(qui était inutile
sur un VT100 mais bien pratique sur un
xterm).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.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.)-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 [Caractère Unicode +FFFD] % echo caféthé | cut -c 5 [Caractère Unicode +FFFD] % 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 ?
man -k
delete
ne trouve pas la commande
rm…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.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 :
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)