Shell invocation
Langues : anglais
samedi 10 mai 2014
Bash et Zsh (pour ceux que je connais) ont des façons très différentes de démarrer, ce qui peut créer des soucis lorsqu'on passe de l'un à l'autre.
Pour commencer, on distingue deux états
du
shell :
- Shell de login ou non
- Shell interactif ou non
Shell de login
Pour indiquer à un shell que c'est un shell de login, le programme qui
l'appelle met simplement un -
devant son nom (ainsi le shell s'appellera
-bash ou -zsh). Certains shells (bash) permettent de
donner un argument à la ligne de commande pour faire comme si c'était un shell
de login
Dans un script, on peut savoir qu'on est dans un login de la façon suivante :
-
Bash:
shopt -q login_shell -
Zsh:
[[ -o login ]]
Shell interactif
Un shell interactif est tout simplement un shell invoqué sans argument (du moins aucun qui n'implique une commande)
Dans un script, on peut savoir qu'on est en mode interactif de la façon suivante :
[[ $- == *i* ]]
(Oui c'est possible d'avoir un shell interactif avec un script, par exemple lorsqu'un fichier est sourcé)
Comportement de zsh à l'invocation
- Dans tous les cas,
/etc/zshenvet~/.zshenvsont sourcés (dans cet ordre). - Si c'est un shell de login,
/etc/zprofileet~/.zprofilesont sourcés (dans cet ordre)Note
/etc/zprofileest choisi à la compilation et peut varier selon les systèmes (Sur Archlinux c'est/etc/zsh/zprofilepar exemple). - Si le shell est interactif,
/etc/zshrcet~/.zshrcsont sourcés (dans cet ordre). - Enfin, si c'est un shell de login (encore !)
/etc/zloginet~/.zloginsont sourcés (dans cet ordre toujours).
Comportement de bash à l'invocation
- Si c'est un shell de login et interactif,
/etc/profileest sourcé, puis le premier existant parmi~/.bash_profile,~/.bash_login,~/.profile. - Si c'est un shell interactif non login,
~/.bashrcest sourcé. - Enfin, si c'est un shell non-interactif,
$BASH_ENVest sourcé.
Bash invoqué comme sh
Dans beaucoup de distributions, sh est simplement un lien
symbolique vers bash. Dans ce cas, bash se comportera différemment
à l'invocation :
- Si c'est un shell de login et interactif,
/etc/profileet~/.profilesont sourcés - Si
$ENVest un fichier, il est sourcé également