我很难理解:
- 是如何
.bashrc
解析的 - Bash 函数是如何构造的
我尝试自定义我的终端提示。我的.bashrc
使用方式PROMPT_COMMAND
如下(实际上要复杂得多):
function prompt_command {
PS1="-> "
}
PROMPT_COMMAND=prompt_command
我不喜欢这个解决方案,因为它使我的 shell 命名空间变得混乱prompt_command
,而它应该从该文件的外部隐藏(但我不能使用,unset
因为这会破坏提示)。
所以,我发现我也可以PROMPT_COMMAND
像这样设置纯文本:
PROMPT_COMMAND='PS1="-> "'
正如我所说,我的提示命令实际上要复杂得多。因此,我担心这种替代方案的效率。
.bashrc
尽管这两种方法在功能上是等效的,但是 my 的解析方式和提示命令的构造方式是否有根本的区别? Bash 是否能够有效地“编译”和“缓存”prompt_command
作为函数对象,或者是否像解析字符串一样为每个新的 shell 行解析它?
答案1
.bashrc
每次启动新的终端会话时都会解析该文件一次。
在解析过程中,函数prompt_command
被添加到环境变量中,但没有“编译”步骤,也没有构造为“对象”Bash 是一种单遍解释器语言。
当在我的终端中输入新行时,PROMPT_COMMAND
将执行它,它有效地从环境变量中检索prompt_command
(与我在 shell 中输入的方式相同prompt_command
)并逐行执行它。因此,该行为类似于直接将命令分配给PROMPT_COMMAND
。直接赋值甚至应该(不知不觉地)更快,因为它避免了需要获取环境变量。