Vous pouvez utiliser la commande pstree(fournie par défaut avec Ubuntu). Voici un exemple - actuellement, je n'ai qu'une seule fenêtre de terminal ouverte sur WSL:
User@Wsl:~$ pstree
init─┬─init───bash───pstree
     └─{init}
User@Wsl:~$ bash
User@Wsl:~$ sh
$ bash
User@Wsl:~$ pstree
init─┬─init───bash───bash───sh───bash───pstree
     └─{init}
Dans un environnement Linux / Ubuntu réel, l'arborescence des processus sera plus compliquée. Nous pouvons filtrer l’arbre par l’option -squi montrera les parents d’un processus sélectionné. Donc, notre commande pourrait être pstree -s $$, où $$est une variable d’environnement contenant le PID actuel:
User@Ubuntu:~$ pstree -s $$
systemd──lightdm──lightdm──upstart──gnome-terminal-──bash──pstree
User@Ubuntu:~$ bash
User@Ubuntu:~$ sh
$ bash
User@Ubuntu:~$ pstree -s $$
systemd──lightdm──lightdm──upstart──gnome-terminal-──bash──bash──sh──bash──pstree
Les références:
Ajouter un indicateur à l'invite du shell: Sur la base de l' idée de @ waltinator , afin d'avoir un compteur devant l'invite pour plusieurs obus différents lorsque le niveau est supérieur à un, j'ai ajouté les lignes affichées en dessous de la démo, au bas des fichiers d’ exécution commandes ( ~/.*rc) pertinents .
J'ai effectué des tests sur WSL, Ubuntu 16.04, Ubuntu 18.04 (serveur / ordinateur de bureau), Ubuntu 19.04, dans les sessions gnome-terminal, tty et ssh. Voici comment cela fonctionne:

La limitation est que: le compteur ne fonctionne que pour 13-14 niveaux de profondeur, en fonction du système d'exploitation. Je n'ai pas l'intention d'enquêter sur les raisons :)
- bash>- .bashrc:
 - DEPTH=$(($(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 1))
if (( DEPTH > 1 )); then PS1=$DEPTH:$PS1; fi
 
- cshet- tcsh>- .cshrc:
 - @ DEPTH = `pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'` - 0
if ( $DEPTH > 1 ) then; set prompt="$DEPTH":"$prompt"; endif
 
- zsh>- .zshrc:
 - DEPTH=$(($(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 1))
if (( DEPTH > 1 )); then PROMPT=$DEPTH:$PROMPT; fi
 
- ksh>- .kshrc:
 - DEPTH=$(($(pstree -s $$ | sed -r 's/\-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 0))
if (( DEPTH > 1 )); then PS1="$DEPTH":"$PS1"'$ '; fi
 
- shc'est en fait- dashsur Ubuntu - ici les choses sont un peu compliquées et câblées (lisez les références ci-dessous pour plus d'informations):
 - 
- Editez le - ~/.profilefichier et ajoutez la ligne suivante en bas:
 - ENV=$HOME/.shrc; export ENV
 
- Créez le fichier - ~/.shrcavec le contenu suivant, note- kshlit également le- $ENV:
 - #!/bin/dash
DEPTH=$(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>')
if [ "$0" != 'ksh' ]; then DEPTH=$((DEPTH - 1)); fi
if [ "$DEPTH" -gt 1 ]; then export PS1='$DEPTH:\$ '; fi
 
 
Les références:
Créez une commande qui affichera la profondeur: Une autre option consiste à créer une commande shell qui affichera la profondeur. Pour cela, créez le fichier exécutable (il devrait donc être accessible à l’ensemble du système):/usr/local/bin/depth
sudo touch /usr/local/bin/depth
sudo chmod +x /usr/local/bin/depth
Editez le fichier avec votre éditeur favori et ajoutez les lignes suivantes comme contenu:
#!/bin/bash
SHELLS='(bash|zsh|sh|dash|ksh|csh|tcsh)'
DEPTH=$(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec "\<$SHELLS\>")
if [[ $@ =~ -v ]]
then
        pstree -s $$ | sed -r 's/-+/\n/g' | grep -E "\<$SHELLS\>" | cat -n
fi
echo "DEPTH: $DEPTH"
[[ $DEPTH -gt 1 ]] && exit 0 || exit 1
Le script ci-dessus a deux options -vou --verbosequi produira une liste des shells impliqués. Et l’autre option permettant de vérifier si la profondeur est supérieure à 1 et sur cette base sera retourné exit 0ou exit 1, vous pouvez donc l’utiliser de cette manière depth && exit. Voici quelques exemples d'utilisation:
User@Ubuntu:~$ depth          # we are at the 1st level - bash
DEPTH: 1
User@Ubuntu:~$ sh           
$ csh                         # we are at the 2nd level - dash
Ubuntu:~% depth               # we are at the 3rd level - csh
DEPTH: 3
Ubuntu:~% ksh
$ depth -v                    # we are at the 4th level - ksh
     1  bash
     2  sh
     3  csh
     4  ksh
DEPTH: 4
$ depth && exit               # exit to the 3rd level - csh
DEPTH: 4
Ubuntu:~% depth && exit       # exit to the 2nd level - dash
DEPTH: 3
exit
$ depth && exit               # exit to the 1st level - bash
DEPTH: 2
User@Ubuntu:~$ depth && exit  # stay at the 1st level - bash
DEPTH: 1
User@Ubuntu:~$ depth && exit  # stay at the 1st level - bash
DEPTH: 1
Comparaison par les autres solutions: j'ai passé un peu plus de temps à découvrir certaines faiblesses des approches présentées ici. J'ai pu imaginer les deux cas suivants (les majuscules sont nécessaires pour une meilleure mise en évidence de la syntaxe):
- Quand - suou- sudo -isont impliqués:
 - User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
1
User@Ubuntu:~$ echo $SHLVL
1
User@Ubuntu:~$ depth
DEPTH: 1
User@Ubuntu:~$ su spas
Password:
Spas@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
1
Spas@Ubuntu:~$ echo $SHLVL
2
Spas@Ubuntu:~$ depth
DEPTH: 2
Spas@Ubuntu:~$ sudo -i
[sudo] password for spas:
Root@Ubuntu:~# ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
3
Root@Ubuntu:~# echo $SHLVL
1
Root@Ubuntu:~# depth
DEPTH: 3
 
- Lorsqu'un processus en arrière-plan est lancé: - User@Ubuntu:~$ bash
User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
2
User@Ubuntu:~$ echo $SHLVL
2
User@Ubuntu:~$ depth
DEPTH: 2
User@Ubuntu:~$ while true; do sleep 10; done &
[1] 10886
User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
3
User@Ubuntu:~$ echo $SHLVL
2
User@Ubuntu:~$ depth
DEPTH: 2
# Note: $SHLVL is not supported only by sh/dash.  
#       It works with all other tested shells: bash, zsh, csh, tcsh, ksh
User@Ubuntu:~$ sh
$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
4
$ echo $SHLVL
2
$ depth
DEPTH: 3