我怎么知道我是否正在运行嵌套shell?

Man*_*qui 60 unix linux bash shell

当使用*nix shell(通常是bash)时,我经常会生成一个子shell,我可以用它处理一个小任务(通常在另一个目录中),然后退出以恢复父shell的会话.

偶尔,我会忘记我是在运行嵌套shell,还是在我的顶层shell中,我会不小心产生一个额外的子shell或者错误地退出顶级shell .

有没有一种简单的方法来确定我是否在嵌套的shell中运行?或者我是以完全错误的方式解决我的问题(通过产生子壳)?

Joh*_*ica 70

$SHLVL变量跟踪您的shell嵌套级别:

$ echo $SHLVL
1
$ bash
$ echo $SHLVL
2
$ exit
$ echo $SHLVL
1
Run Code Online (Sandbox Code Playgroud)

作为产生子shell的替代方法,您可以从堆栈中推送和弹出目录并保持在同一个shell中:

[root@localhost /old/dir]# pushd /new/dir
/new/dir /old/dir
[root@localhost /new/dir]# popd
/old/dir
[root@localhost /old/dir]#
Run Code Online (Sandbox Code Playgroud)

  • 推/弹的选项:`[root @/old/dir] #cd/new/dir`然后`[root @/new/dir] #cd -`会让你回到`[root @/old/dir] #` (2认同)

Pau*_*ce. 23

这是我提示的一部分的简化版本:

PS1='$(((SHLVL>1))&&echo $SHLVL)\$ '
Run Code Online (Sandbox Code Playgroud)

如果我不在子shell中,它不会添加任何额外的东西,但如果我在任何级别的子shell中它会显示深度.

  • 非常有用。想看到更多你的 .bashrc fu! (2认同)

mar*_*ton 11

看看$0:如果它以减号开头-,那么你就在登录shell中.

  • +1因为它没有使用bashisms,但通常是有效的. (5认同)
  • 嗯,如果我在另一个虚拟控制台上登录,这是可行的,但是如果我打开一个新的`gnome-terminal`,那是无效的。$ SHLVL`为1,但$ 0没有`-`。另外,在tmux中,当我有`$ SHLVL == 2`时,我得到`$ 0`前面有`-`。我糊涂了。 (2认同)

mel*_*chi 8

pstree -s $$ 看你的深度是非常有用的.