Question Comment savoir si j'exécute un shell imbriqué?


Lorsque vous utilisez un shell * nix (généralement bash), je crée souvent un sous-shell avec lequel je peux prendre en charge une petite tâche (généralement dans un autre répertoire), puis quitter pour reprendre la session du shell parent.

De temps en temps, je perds la trace du fait que je lance un shell imbriqué, ou dans mon shell de niveau supérieur, et que je crée accidentellement un sous-shell supplémentaire ou quitte le shell de niveau supérieur par erreur. .

Existe-t-il un moyen simple de déterminer si je cours dans un shell imbriqué? Ou est-ce que je vais à propos de mon problème (en créant des sous-coquilles) d'une manière complètement fausse?


51
2017-12-22 16:39


origine


Réponses:


le $SHLVL variable suit votre niveau d'imbrication de shell:

$ echo $SHLVL
1
$ bash
$ echo $SHLVL
2
$ exit
$ echo $SHLVL
1

Au lieu de générer des sous-shells, vous pouvez pousser et afficher des répertoires à partir de la pile et rester dans le même shell:

[root@localhost /old/dir]# pushd /new/dir
/new/dir /old/dir
[root@localhost /new/dir]# popd
/old/dir
[root@localhost /old/dir]#

62
2017-12-22 16:48



Voici une version simplifiée d'une partie de mon invite:

PS1='$(((SHLVL>1))&&echo $SHLVL)\$ '

Si je ne suis pas dans un sous-shell, il n’ajoute rien de plus, mais il montre la profondeur si je suis dans un niveau quelconque de sous-shell.


21
2017-12-22 19:27



Regarder $0: si ça commence par un moins -, vous êtes dans le shell de connexion.


11
2017-12-22 16:47



pstree -s $$ est très utile pour voir votre profondeur.


6
2018-01-31 07:10



ptree $$ vous montrera également combien de niveaux vous êtes profond


0
2017-12-22 19:32



La variable d'environnement $SHLVL contient le shell "profondeur".

echo $SHLVL

La profondeur de coque peut également être déterminée en utilisant pstree (version 23 et supérieure):

pstree -s $$ | grep sh- -o | wc -l

J'ai trouvé la deuxième façon d'être plus robuste que la première dont la valeur a été réinitialisée lors de l'utilisation sudo ou est devenu peu fiable avec env -i.

Aucun d'entre eux ne peut traiter correctement su.


Les informations peuvent être mises à disposition dans votre invite:

PS1='\u@\h/${SHLVL} \w \$ '
PS1='\u@\h/$(pstree -s $$ | grep sh- -o | tail +2 | wc -l) \w \$ '

le | tail +2 est là pour enlever une ligne de la grep sortie. Puisque nous utilisons un pipeline à l'intérieur d'un "$(...)"substitution de commande, le shell doit invoquer un sous-shell, pstree le signale et grep en détecte un autre sh- niveau.


Dans les distributions basées sur Debian, pstree fait partie du paquet psmisc. Il peut ne pas être installé par défaut sur les distributions non-desktop.


0
2017-11-02 04:49



Si vous exécutez à l'intérieur du sous-shell le code suivant, vous obtiendrez 2:

ps | fgrep bash | wc -l

Sinon, cela donnera 1.

MODIFIER Ok, ce n'est pas une approche aussi robuste que cela a été souligné dans les commentaires :)
Une autre chose à essayer est

ps -ef | awk '{print $2, " ", $8;}' | fgrep $PPID 

rapportera 'bash' si vous êtes en sous-shell.


-1
2017-12-22 16:43