Bash:PS1 与 Prompt 命令用于设置提示和标题

Bash:PS1 与 Prompt 命令用于设置提示和标题

在设置提示和终端标题的性能/效率方面,以下选项之间有很大区别吗?(除了额外调用echo

  1. 将 PS1 设置为命令的输出:
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. 用于PROMPT_COMMAND直接设置 PS1:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
    PS1="my prompt"
}

答案1

效率:

  • PS1="$(fun)"将调用函数就一次(当解析赋值时)并将使用子 shell 进程。如果输出完全是静态的,这是最有效的选项。
  • PROMPT_COMMAND=fun将调用函数每次(每当显示提示时)并将在主 shell 进程中运行它。
  • PS1="\$(fun)"将调用函数每次(每当显示提示时)并且每次都会产生一个子 shell 进程,这使得它比 PROMPT_COMMAND 效率更低(但有时是必要的;请参阅下一部分。)

正确性:

  • 的内容PS1提供给 Readline,这样它就可以知道提示宽度,并在输入不再适合一行时正确地换行。当从 PS1 调用函数(例如PS1="\$(foo)")时,您需要使用\001\002而不是通常的\[和来换行不可见的序列\]
  • 的结果PROMPT_COMMAND直接显示在屏幕上,Readline 并不知道。如果您尝试单独使用此方法(即与空的 一起使用PS1=""),您会注意到,只要输入超过一行,光标就不再有意义,并且您无法再从第 2 行退格到第 1 行。
  • 对于多行 shell 提示符,前面几行如何显示并不重要,只要最后的线仍然显示出来PS1
  • 使用什么来设置终端标题也没有关系,因为无论如何它都不会被计入提示宽度。

相关内容