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 d'agir en fonction de la sortie, ou bien dans un fichier script, passé en argument au shell.

Tout 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 (c'est une liste de répertoires, examinés successivement jusqu'à y trouver la commande recherchée). Cependant, alias et fonctions ne sont pas héréditaires.

On distingue plusieurs classes de shells, regroupées en deux familles : d'une part, la famiile Bourne ou Korn, composée des classes sh, bash, ksh, zsh, d'autre part la famille C, composée des classes 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 la classe de shell courant, voici une commande (heureusement reconnue par tous les shells)  : ps -p$$. Ne pas se fier à la variable SHELL ! On peut imposer la classe de shell qui va interpréter un script dans la première ligne du script, par exemple  : #!/bin/sh.

Pour se faire une idée des différentes classes de 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 le 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 le 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 i in pdf tex
do mv tutu.$i toto.$i
done
#!/bin/bash
ls|xargs -I% echo % %|sed s/toto/titi/2|xargs -n 2 mv

Bug sous Debian : la commande scp ne fonctionne pas quand ~/.bashrc de la cible produit une sortie (par exemple, avec la commande echo) !

zsh

Scripts de configuration :

De plus, il y a des options d'inhibition, sauf de /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 $fpath/*(:t)) généralise mv à des expressions régulières, d'où une solution élégante de l'exercice de renommage :

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

Voici un programme qui remet en minuscules toutes les extensions (récursivement) :

zmv -n '(**/)(*).(#i)(*)' '$1$2.${(L)3}' .
L'option -n montre ce qui va être fait mais ne fait rien (en anglais « dry run »). Voir ici et 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 l'application TinkerTool, notamment, pour afficher les fichiers 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 avec 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.

mac-de-papa% 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 mis à zéro pour commencer 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).

Conclusion

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


Dernière modification : (2017-07-13 13:09:12 CEST)