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/zshenv
et~/.zshenv
sont sourcés (dans cet ordre). - Si c'est un shell de login,
/etc/zprofile
et~/.zprofile
sont sourcés (dans cet ordre)Note
/etc/zprofile
est choisi à la compilation et peut varier selon les systèmes (Sur Archlinux c'est/etc/zsh/zprofile
par exemple). - Si le shell est interactif,
/etc/zshrc
et~/.zshrc
sont sourcés (dans cet ordre). - Enfin, si c'est un shell de login (encore !)
/etc/zlogin
et~/.zlogin
sont sourcés (dans cet ordre toujours).
Comportement de bash à l'invocation
- Si c'est un shell de login et interactif,
/etc/profile
est sourcé, puis le premier existant parmi~/.bash_profile
,~/.bash_login
,~/.profile
. - Si c'est un shell interactif non login,
~/.bashrc
est sourcé. - Enfin, si c'est un shell non-interactif,
$BASH_ENV
est 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/profile
et~/.profile
sont sourcés - Si
$ENV
est un fichier, il est sourcé également