[BASH] Matrix dans votre terminal
Par Baz le 09/10/2009 à 10:55 - Scripts Bash
Voici différentes manières d'imiter le célèbre écran vert présent dans le film Matrix, en Bash.
C'est en parcourant le site commandlinefu.com que je suis par hasard tombé sur ces lignes de commandes amusantes.
Note : Il suffit de copier/coller ces lignes dans un terminal pour en visualiser le résultat. Sauf une très mauvaise manipulation de votre part, ces commandes ne présentent aucun risque.
Nous allons donc voir trois méthodes différentes qui permettent de faire défiler des caractères dans un terminal, dans le but d'imiter ce qui apparait sur l'écran de l'ordinateur de Néo dans le film Matrix :
- Une première façon de faire, postée par Allinurl, donne une idée de ce qu'il est possible d'obtenir en utilisant "tr", "urandom" "dd" et "grep". Le réalisme n'est pas le meilleur mais y a de l'idée :
tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR="1;32" grep --color "[^ ]"
- Une autre méthode postée par Patola, permet d'afficher seulement les caractères 0 et 1 en utilisant cette fois une boucle "while", "seq", la variable "$RANDOM" et une condition "if". Plus gourmande en ressource mais également un poil plus réaliste :
echo -e "\e[32m"; while $t; do for i in `seq 1 30`;do r="$[($RANDOM % 2)]";h="$[($RANDOM % 4)]";if [ $h -eq 1 ]; then v="\e[1m $r";else v="\e[2m $r";fi;v2="$v2 $v";done;echo -e $v2;v2="";done;
- Enfin, une dernière méthode, postée par Dennisw, similaire à la façon de faire précédente mais offrant un résultat qui me semble plus convaincant bien que l'affichage soit un petit peu trop rapide à mon goût :
echo -e "\e[32m"; while :; do for i in {1..60}; do r="$(($RANDOM % 2))"; if [[ $(($RANDOM % 5)) == 1 ]]; then if [[ $(($RANDOM % 4)) == 1 ]]; then v+="\e[1m $r "; else v+="\e[2m $r "; fi; else v+=" "; fi; done; echo -e "$v"; v=""; done
Bien sûr, tout ceci est perfectible mais c'est quand même amusant de voir ce que l'on peut faire en quelques lignes de Bash. Comme quoi, il en faut peu pour s'amuser
Commentaires
Sympa, même si il manque le coté "coulant" des chiffres de matrix :) Mais il faudrait utiliser ncurses pour arriver à ce résultat...
@Edouard: Salut ! Effectivement le truc qui manque c'est bien le coté "coulant" des caractères. Ici tout l'écran défile à la même vitesse alors que dans Matrix chaque colonne de caractères descend à sa propre vitesse...
C'est surement faisable avec Ncurses comme tu le suggères, mais bon, je ne m'en suis jamais servi et je suis pas assez fan de Matrix pour me lancer la dedans :p
tout de même la matrice irl ça peut encore en bluffer plus d'un ;)