我有一个PS1
如果 SLVL 不是 1,则会显示 SLVL,以便快速查看我是否处于子 shell 中。使用 GNOME 时,这可以按预期工作,但是当我在 Awesome WM ( Mod4+ )中生成新终端时,Return它总是以SHLVL=2
或更高版本开头。这是正常的吗?
这与我重新启动 Awesome 的次数(++Mod4或)直接相关。有什么方法可以避免重新启动时产生新的外壳吗?Ctrlrpkill -HUP awesome
这些 提交似乎是相关的,因为 Awesome 最终运行了类似$SHELL -c ...
on 的东西HUP
,但我不知道足够的 C 来修复它。
我的/bin/sh
是dash
,我的登录 shell 是bash
。
答案1
我想我明白原因,但我没有完整的解决方案。
的行为SHLVL
取决于 shell。在 dash 和 ksh(pdksh 和 ksh93)中,只有交互式实例才会递增SHLVL
。在 bash 和 zsh 中,所有实例都会递增SHLVL
,甚至递增bash -c …
。
如果您在之后观察到行为发生变化这个补丁,很可能你的/bin/sh
是 dash ,你的$SHELL
是 bash 。之前,awesome 正在执行/bin/sh -c …
,没有改变SHLVL
。补丁之后,它现在正在执行$SHELL -c …
,bash -c …
即递增SHLVL
。
你可以通过改变SHLVL
Awesome 内部来作弊。挂钩启动代码以减少SHLVL
1。我很确定这是可能的,无需重新编译 C 代码,尽管我不知道 Lua 代码。