# A la découverte du shell rc

**URL:** <https://www.debian-fr.org/t/a-la-decouverte-du-shell-rc/89054>\
**Category:** Programmation\
**Created:** [Octobre 30, 2023, 8:34 UTC](https://www.debian-fr.org/t/a-la-decouverte-du-shell-rc/89054 "2023-10-30T20:34:04Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Octobre 30, 2023, 8:34 UTC](https://www.debian-fr.org/t/a-la-decouverte-du-shell-rc/89054/1 "2023-10-30T20:34:04Z")

</div>

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 ‹&nbsp;;&nbsp;› 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 )

```auto
# 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 "

```auto
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 )

```auto
# 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 …

```auto
; 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 …

```auto
; 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

```auto
; 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

```auto
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 :

```auto
; 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]

```auto
; echo $P
PATH PRINTER PWD

```

### rapide comparaison des shells

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

```auto
; 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 : $\* «&nbsp;$\*&nbsp;» $@ ou «&nbsp;$@&nbsp;» ?
- Est-ce qu’il y a une différence entre ${var:-} et «&nbsp;${var-}&nbsp;»
- quand est-ce que ${var+x} ne retourne pas ‹&nbsp;x&nbsp;› ?
- Que donne la syntaxe «&nbsp;${var:-f}iable&nbsp;» 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 «&nbsp;chelou&nbsp;» du enre &nbsp; ?
- sed -e ‹&nbsp;s/^\t//g&nbsp;› 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

```auto
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)
