A la découverte du shell rc

Bonjour,

J’ai installé le paquet rc il y a un mois Voici mes premières impressions au sujet de ce shell
Tout d’abord, quand on lance rc en interactif, on arrive sur une invite de commande on ne peut plus minimale : un simple caractère ‹ ; › Ce simple’;’
en début de ligne facilite le copier coller d’une ligne de commande puisque le shell l’interprète comme la fin d’une commande précédente vide.
La version empaquetée par Debian incorpore la libreadline ce qui fait qu’on bénéficie d’un historique des commandes passées accessible via FlecheHaut comme dans bash De ce point de vue, dash qui est le shell système par défaut de Debian est au standard POSIX mais pratiquement inutilisable en interactif.

variables littérales (simples chaînes de caractères )

# assination   var = 'la chaîne littérale'

qdc = 'n''importe quoi'

# on peut mettre des espaces entre le nom de la variable et sa valeur
# Si on veut insérer une apostrophe dans la chaîne littérale on double ''

# autre exemple
  mere_denis = 'C''est bien vrai ! (comme le disait la mère Denis)'

# on n'est pas obligé de coller le nom de la variable tout à gauche

Comme avec un shell POSIX, on peut écrire une commande qui retourne vrai suivie de " && echo oui "

true ne sert à rien && echo $mere_denis
C'est bien vrai ! (comme le disait la mère Denis)

remarquez qu’il n’y a pas besoin de mettre des " pour entourer la variable
De plus quand on tape $mer pour le début de la variable voulue on peut appuyer sur Tab pour avoir le mot complet (comme en bash )

# si on tape "$var" on obtient le contenu de var entouré des uillemets "
; echo "$mere_denis"
"C'est bien vrai ! (comme le disait la mère Denis)"

; false is true || echo $qdc
n'importe quoi

Si quelqu’un trouve un cas d’utilisation des commandes false et true qu’il me fasse signe, je suis preneur.

la commande interne (builtin) whatis

rc est minimaliste, il intègre une commande interne qui permet savoir comment est interprété un mot
pour savoir si on a des commandes internes whatis -b nom …

; whatis -b whatis builtin echo true
builtin whatis
builtin builtin
builtin echo
true not found

Pour connaître les contenus de variables whatis -v var …

; whatis -v qdc mere_denis PATH false
qdc='n''importe quoi'
mere_denis='C''est bien vrai ! (comme le disait la mère Denis)'
PATH=/home/fp2/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/home/fp2/bin
false not found

pour explorer les chemins (path) whatis -p

; whatis -p /usr/bin/who* /usr/bin/tru* /bin/fals*
/usr/bin/who
/usr/bin/who-permits-upload
/usr/bin/who-uploads
/usr/bin/whoami
/usr/bin/whodepends
/usr/bin/whois
/usr/bin/truncate
/usr/bin/trust
/bin/false

simple et de bon goût on vient de trouver d’où sort false
si on ne met pas d’option -f/-p/-v/-b on a un succedane de which ou command -v

whattis  false ls true echo
/bin/false
/bin/ls
/bin/true
builtin echo

Remarque l’option -f c’est pour les fonctions
Si vous utilisez l’option -v sans mettre de noms de variables toutes les variables seront listées et la sortie peut être longue :

; whatis -v DISPLAY TERM
DISPLAY=:0.0
TERM=tmux-256color
;
; whatis -v | fgrep XDG
XDG_SESSION_CLASS=user
XDG_SEAT=seat0
XDG_SESSION_ID=5
XDG_CONFIG_DIRS=/etc/xdg
XDG_RUNTIME_DIR=/run/user/1000
XDG_SESSION_TYPE=x11
XDG_SESSION_DESKTOP=xfce
XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share/:/usr/share/:/usr/share
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_MENU_PREFIX=xfce-
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_VTNR=7
XDG_CURRENT_DESKTOP=XFCE
XDG_GREETER_DATA_DIR=/var/lib/lightdm/data/fp2

Exemple en tapant $P[Tab]

; echo $P
PATH     PRINTER  PWD

rapide comparaison des shells

On s’intéresse à la place prise en mémoire et sur disque.

; readlink -f /bin/rc
/usr/bin/rc.byron

; ls -lApst  /usr/bin/rc.byron /bin/bash /bin/dash
1208 -rwxr-xr-x 1 root root 1234376 27 mars   2022 /bin/bash
 108 -rwxr-xr-x 1 root root  110128 29 mars   2021 /usr/bin/rc.byron
 124 -rwxr-xr-x 1 root root  125560 10 déc.   2020 /bin/dash

; size  /usr/bin/rc.byron /bin/bash /bin/dash
   text    data     bss     dec     hex filename
 100602    3452    6688  110742   1b096 /usr/bin/rc.byron
1180850   47732   45112 1273694  136f5e /bin/bash
 110643    4856   11568  127067   1f05b /bin/dash

Conclusion : le shell rc combine une approche minimaliste une syntaxe très régulière et une sémantique sans surprise; ce qui en fait un outil très agréable à utiliser. On peut enfin envisager de programmer en shell (non POSIX) sans se poser des questions du genre

  • pour gérer la line de commande que faut-il utiliser : $* « $* » $@ ou « $@ » ?
  • Est-ce qu’il y a une différence entre ${var:-} et « ${var-} »
  • quand est-ce que ${var+x} ne retourne pas ‹ x › ?
  • Que donne la syntaxe « ${var:-f}iable » lorsqu’on remplace var par 2 ?
  • Comment obtenir le code de retour des commandes d’un pipeline ?
  • Peut-on obtenir le code de retour d’une commande dont on capture la sortie par $(cde args)
  • pour capturer la sortie d’une commande $(cde ars …) comment positionner IFS et où mettre les " ?
  • Comment savoir si $var commence ou finit par un blanc ’ ’ ou une tabulation ??
  • Comment savoir si une variable contient un ou plusieurs caractères « chelou » du enre   ?
  • sed -e ‹ s/^\t//g › va-t-il supprimer un caractère tabulation en début de ligne ou bien \ et t ?
  • etc …

Les réponses à ce genre de questions feront l’objet de prochains messages. J’invite les personnes intéressées à installer le paquet rc et à commencer par

null = ''   # null string
nil = ()    # vide rien nada zilch
whatis -v null nil PATH path IFS ifs zobi nil tab nl

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean
Ingénieur civil du Génie Maritime. à la retraite

« On ne perd pas son temps en aiguisant ses outils. »
Proverbe français

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)