在 .bashrc 中使用纯字符串命令而不是函数的含义(特别是对于 PROMPT_COMMAND 和 PS1)

在 .bashrc 中使用纯字符串命令而不是函数的含义(特别是对于 PROMPT_COMMAND 和 PS1)

我很难理解:

  • 是如何.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。直接赋值甚至应该(不知不觉地)更快,因为它避免了需要获取环境变量。

相关内容