Shells

Un shell d'Unix est un programme interpréteur de ligne de commande, en mode texte, dans un terminal, à la suite d'une invite, souvent % ou $. On peut entrer les lignes de commande interactivement, une à une, ce qui permet de réagir à la sortie de chaque ligne, ou bien en lot, dans un fichier script passé en argument au shell.

Un shell peut être configuré initialement au moyen d'un script, où on peut définir des variables, fonctions, alias.

Le shell de session d'un utilisateur (en anglais « login shell ») est celui avec lequel il s'identifie et lance d'autres shells.

Tout shell lancé à partir d'un shell hérite de ses variables d'environnement, définies spécialement. En particulier, la variable d'environnement PATH contient le chemin de recherche de commande (liste de répertoires examinés successivement jusqu'à y trouver une commande). Cependant, les variables ordinaires, alias et fonctions ne sont pas héréditaires.

On distingue deux familles de shells : d'une part, la famille Bourne ou Korn, composée de sh, bash, ksh, zsh, d'autre part la famille C, composée de csh, tcsh, dont la syntaxe est plus proche du langage C (langage de programmation du shell). Historiquement, après sh vint csh, plus interactif, puis ksh plus puissant. POSIX est une tentative de standardisation, à partir de ksh.

Pour déterminer le shell courant, ne pas se fier à la variable SHELL mais lancer cette commande (heureusement reconnue par tous les shells) : ps -p$$. On peut imposer le shell qui va interpréter un script dans la première ligne du script, par exemple : #!/bin/sh, ligne dite « shebang ». Ce mécanisme se généralise à d'autres langages de script.

Pour se faire une idée des différents shells, on va regarder les fichiers de configuration et la programmation d'une tâche simple, par exemple, renommer un lot de fichiers de même nom (toto), sauf l'extension (pdf ou tex etc.) :

% ls
toto.pdf toto.tex

tcsh

Scripts de configuration : pour tout shell de session : /etc/csh.login et ~/.login ; pour tout shell : /etc/csh.cshrc et ~/.cshrc.

Commande pour définir une variable d'environnement : setenv.

Script de renommage :

#!/bin/tcsh
foreach ext (tex pdf)
mv toto.$ext titi.$ext
end
à généraliser pour un ensemble d'extensions quelconque…

bash

Scripts de configuration : pour tout shell de session : /etc/profile et ~/.profile ou ~/.bash_profile ; pour tout shell interactif : /etc/bashrc et ~/.bashrc.

Commande pour définir une variable d'environnement : export.

Scripts de renommage :

#!/bin/bash
for ext in pdf tex
do mv toto.$ext titi.$ext
done
#!/bin/bash
ls|xargs -I% echo % %|sed s/toto/titi/2|xargs -n 2 mv

zsh

Scripts de configuration :

De plus, il y a des options d'inhibition de ces scripts sauf /etc/zshenv.

Commande pour définir une variable d'environnement : export.

zsh est compatible avec Unicode donc supporte les accents dans les noms de fichiers.

La fonction zmv (à charger avec autoload zmv) généralise mv à des expressions globales donc pour renommer :

zmv -W 'toto.*' 'titi.*'

Voici encore un programme qui remet en minuscules toutes les extensions de tous les fichiers :

zmv -n '(**/)(*).(#i)(*)' '$1$2.${(L)3}'
L'option -n montre ce qui va être fait mais ne fait rien (en anglais « dry run »). Pour la documentation de zmv, voir man zshcontrib.

Mac OS (X)

C'est un système d'exploitation d'Apple, basé sur Darwin, lui-même dérivé de FreeBSD, lui même cousin de Sun OS. Aqua est l'interface graphique de Mac OS X. Les programmes en mode texte fonctionnent à l'intérieur de l'application Terminal. Ce qui suit s'applique à Mac OS X.11 El Capitan, dernière version compatible avec mon Macbook pro de 2009.

Préférences et configuration

Les préférences de Mac OS X sont sensées être dans /Library ou ~/Library. Elles sont pour la plupart accessibles graphiquement avec menu pomme, System Preferences…, sinon TinkerTool, notamment, pour afficher les fichiers (cachés par défaut) dont le nom commence par point (.) dans le finder.

Certaines commandes spéciales et peu connues permettent de modifier les préférences en mode texte, ce qui est utile en particulier lors d'une connexion ssh.

Bien que Mac OS X soit multilingue, j'utilise l'anglais comme langue du système, parce que, d'une part, le français est parfois mal traduit (et même à contre-sens) et d'autre part les recherches sur internet sont généralement plus fructueuses en anglais.

J'ai choisi zsh comme shell de session avec System Preferences…, Accounts, dévérouiller, contrôle clic sur le compte à modifier, Advanced options, menu Login shell.

% more /etc/zshenv
## system-wide environment settings for zsh(1)
## see man path_helper
# if [ -x /usr/libexec/path_helper ]; then
# eval `/usr/libexec/path_helper -s`
# fi

if [ -x /usr/libexec/path_helper ]; then
PATH=""
eval `/usr/libexec/path_helper -s`
fi

export INFOPATH=/usr/local/texlive/2014/texmf-dist/doc/info:/usr/local/share/info:/usr/share/info
PATH est initialement vide puis accru des valeurs contenues dans les fichiers /etc/paths et /etc/paths.d/*, en évaluant la sortie de la commande /usr/libexec/path_helper.

Mieux vaut ne pas toucher MANPATH, tant que man fonctionne bien (voir le fichier /etc/man.conf et la commande manpath).

Linux

Suite au choix d'Apple : d'une part, ne plus proposer de mise à jour de Mac OS pour les machines anciennes, d'autre part, fabriquer des machines à durée de vie courte (dont les composants sont soudés ou collés), et suite au mauvais fonctionnement de XQuartz, je suis passé à Linux Ubuntu (2020). Avec Ubuntu, problèmes avec le touchpad, les applications de type Snap donc je suis passé à Fedora (2022). Avec Fedora, problèmes de démarrage, mode veille, installeur version 37 incompatible avec mes Macs alors je suis passé à Manjaro (2023), et là, miracle, tout marche bien.

Cependant, pour le système de fenêtre, j'utilise X11 mais non Wayland parce que trop de programmes ne marchent pas avec Wayland (en particulier le partage d'écran).

Conclusion

Explorer les possibilités et suivre les progrès d'Unix permet de travailler plus efficacement.

Voir unix.com


Dernière modification : (2023-11-29 10:15:53 WET)