Ubuntu – How often can I type exit without logging out

bashcommand linessh

I logged in to Debian 7 via SSH, not as root. When writing sudo all the time became too much overhead, I did sudo su. Since the Debian default shell (dash ?) does not support the Tab key to complete filenames, I ran /bin/bash. I added a few aliases to .bash_aliases and to activate them, I ran /bin/bash again (potentially a few more times) until I got all aliases right.

After doing some more system setup, I could not remember any more how many times I have to type exit to get back to the beginning but not logging out from SSH.

Actually this is not a big deal, since I could log in via SSH again, so this is more an academic question. I wondered if there is a way to find out

  1. what exactly exit will exit, so I could at least check each time before I type it
  2. how many times I can exit until the user is logged out completely

I tried man exit but it seems there is no manual available. help exit doesn't tell much either.

I first thought I could find a possible solution using pstree, but IMHO it lists sshd too often and sudo su is missing.

:~$ pstree | grep ssh
     |-sshd---sshd---sshd---sh---bash---bash-+-grep

Best Answer

You can use the SHLVL variable to determine how far nested in you're, to a shell started by a login process:

$ echo $SHLVL 
1
$ bash
$ echo $SHLVL 
2
$ bash
$ echo $SHLVL 
3
$ sudo su -            # Start a login shell, clears $SHLVL
# echo $SHLVL 
1
# logout
$ sudo su
# echo $SHLVL 
4
# bash
# echo $SHLVL 
5

Since the login shell from su - clears SHLVL, it has SHLVL=1. To quit the nearest such login shell in the shell ancestry, you have to use exit $SHLVL times.


SHLVL is not supported by dash, so whenever it enters the picture, the figure will be wrong. However, dash isn't the login shell for any usable account on Ubuntu, and SHLVL works on more advanced shells like bash and zsh.


I cannot reproduce your missing sudo su:

$ pstree -ps $$
init(1)───sshd(1404)───sshd(12614)───sshd(12673)───zsh(12674)───sudo(31012)───su(31014)───bash(31016)───pstree(31084)