web-dev-qa-db-fra.com

Pourquoi SHLVL est initialement 2 dans Ubuntu 16.10 (mais pas les versions antérieures)?

Je viens de passer à Ubuntu 16.10. Pourquoi $SHLVLmaintenant commence-t-il par la valeur 2 lorsque j'ouvre le terminal Gnome? Ce n'était pas le cas dans 16.04.

2
user643722

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/

2
jimav

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.).

1
michael

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.

1
muru

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}"
0
waltinator