在设置提示和终端标题的性能/效率方面,以下选项之间有很大区别吗?(除了额外调用echo
)
- 将 PS1 设置为命令的输出:
PS1="\$(my_fun)"
my_fun() {
echo "my prompt"
}
- 用于
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
。 - 使用什么来设置终端标题也没有关系,因为无论如何它都不会被计入提示宽度。