Immae's blog

egrep -ri TODO /etc

Shell invocation

Langues : anglais

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 :

et les shells font des actions différentes en fonction de ces deux états.

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

  1. Dans tous les cas, /etc/zshenv et ~/.zshenv sont sourcés (dans cet ordre).
  2. 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).

  3. Si le shell est interactif, /etc/zshrc et ~/.zshrc sont sourcés (dans cet ordre).
  4. 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

  1. Si c'est un shell de login et interactif, /etc/profile est sourcé, puis le premier existant parmi ~/.bash_profile, ~/.bash_login, ~/.profile.
  2. Si c'est un shell interactif non login, ~/.bashrc est sourcé.
  3. 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 :

  1. Si c'est un shell de login et interactif, /etc/profile et ~/.profile sont sourcés
  2. Si $ENV est un fichier, il est sourcé également