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