Je viens de passer à Ubuntu 16.10. Pourquoi $SHLVL
maintenant commence-t-il par la valeur 2 lorsque j'ouvre le terminal Gnome? Ce n'était pas le cas dans 16.04.
Ce bogue malheureux a été introduit dans Ubuntu 16.10.
Pour une solution de contournement, voir https://bugs.launchpad.net/ubuntu/+source/unity/+bug/1707977/comments/
Suite de mon commentaire dans la question initiale (et, ce n’est pas une réponse en tant que telle, car je ne peux pas répondre "pourquoi", mais je peux vérifier que le nouveau comportement existe):
Cette modification annule la compatibilité ascendante. Maintenant, peu importe la façon dont vous ouvrez un terminal/bash dans Ubuntu, ils commencent tous par SHLVL=2
Bien que je ne sois pas sûr qu'il s'agisse d'un problème spécifique à Ubuntu ou dû à l'utilisation de Unity. S'il se trouve que la logique effectue quelque chose de spécifique lors de la sortie du shell parent (par exemple, l'état de sauvegarde), elle ne s'exécutera plus jamais.
(En outre, je ne suis pas sûr si ~/.bash_logout
est appelé en même temps qu'avant. Je ne suis pas sûr, je ne m'en souviens pas. L'imprévisibilité de ce comportement est la raison pour laquelle nous utilisons une logique personnalisée en fonction de Shell. La seule façon de déclencher ~/.bash_logout
est de quitter explicitement un shell démarré avec bash -l
, tous les autres shells de bash Ubuntu ne sont pas des shells de connexion.
En essayant différentes manières d’essayer de déduire le vrai SHLVL, en essayant de voir s’il existe un autre moyen de distinguer un "parent" contre un sous-shell, cela pourrait fonctionner (la recherche d’ubuntu est facultative, s’il s’agit en fait d’une punaise fonctionnalité.)
$ echo $SHLVL
2
$ my_shlvl() {
lsb_release -i | grep -qi ubuntu && pstree -s $$ | grep -o bash | wc -l
}
$ export -f my_shlvl
$ my_shlvl
1
$ bash
$ echo $SHLVL
3
$ my_shlvl
2
$ exit
$ my_shlvl
1
Cette pirater la solution de contournement est très spécifique à GNU/Linux (par exemple, suppose que pstree
, lsb_release
existe), mais autant que ce soit, ce problème n'existe que sur un sous-ensemble de distributions Linux (jusqu'à présent, juste ubuntu; mais probablement d'autres, aussi) menthe, etc.).
Si vous exécutez une application qui ne démarre pas un shell, mais peut vous donner accès aux variables d'environnement, vous verrez que l'environnement contient déjà SHLVL
avec la valeur 1. Par exemple, j'ai installé et exécuté IDLE3. , a lancé import os
et a vérifié la valeur de os.environ['SHLVL']
, qui s’est avérée être 1.
Maintenant, SHLVL
est également défini et incrémenté dans les scripts. Par conséquent, si j’exécutais un script bash contenant echo $SHLVL
dans un terminal, j’en obtiendrais 3.
Cependant, les consoles/ATS ont toujours une SHLVL
de 1, le coupable doit donc se situer quelque part dans le processus de démarrage de l'interface graphique. Je ne sais pas ce que ce serait exactement, mais je suppose que c'est Unity. Dans GNOME Shell, par exemple, cela ne se produit pas. Quelque part dans le démarrage de Unity, un script bash est probablement présent.
man bash
n’explique pas vraiment _ SHLVL Incremented by one each time an instance of bash is started.
Lorsque vous regardez $SHLVL
dans le terminal Gnome, vous avez deux niveaux de profondeur. Si vous regardez $SHLVL
dans un texte (Ctrl-Alt-F1) il démarrera sous le nom 1
.
On peut suivre la progression de SHLVL
, en ajoutant ces lignes à son .bashrc
:
# keep track of the SHLVL values I see.
export SHLVLs="${SHLVLs:='init'}"
SHLVLs="${SHLVLs}:${SHLVL}"