![为什么 Awesome 中的新终端生成时 SLVL > 1?](https://linux22.com/image/28720/%E4%B8%BA%E4%BB%80%E4%B9%88%20Awesome%20%E4%B8%AD%E7%9A%84%E6%96%B0%E7%BB%88%E7%AB%AF%E7%94%9F%E6%88%90%E6%97%B6%20SLVL%20%3E%201%EF%BC%9F.png)
我有一个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 代码。