PS1和PROMPT_COMMAND有什么区别?

当看看这个真棒线程,我注意到一些例子使用

PS1="Blah Blah Blah" 

和一些使用

 PROMPT_COMMAND="Blah Blah Blah" 

(有些使用两者)在bash shell中设置提示时。 两者有什么区别? SOsearch,甚至更广泛的谷歌search没有得到我的结果,所以即使链接到正确的地方寻找答案将不胜感激。 谢谢!

从GNU Bash文档页面: http : //www.gnu.org/software/bash/manual/bashref.html

 PROMPT_COMMAND If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1). 

我从来没有用过,但是当我只有嘘的时候,我可以使用它。

PROMPT_COMMAND可以包含普通的bash语句,而PS1variables也可以在variables中包含特殊字符,如hostname的“\ h”。

例如,这里是我的bash提示符同时使用PROMPT_COMMAND和PS1。 PROMPT_COMMAND中的bash代码计算出你可能在哪个git分支中,并在提示符处显示出来,以及最后一个运行进程的退出状态,pwd的主机名和基本名。 variablesRET存储最后执行的程序的返回值。 这是很方便的,看看是否有错误和我在terminal上运行的最后一个程序的错误代码。 注意整个PROMPT_COMMANDexpression式的外围。 它包含PS1,因此每次计算PROMPT_COMMANDvariables时都会重新评估该variables。

 PROMPT_COMMAND='RET=$?;\ BRANCH="";\ ERRMSG="";\ if [[ $RET != 0 ]]; then\ ERRMSG=" $RET";\ fi;\ if git branch &>/dev/null; then\ BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\ fi; PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";' 

示例输出在非git目录中看起来像这样:

 sashan@dhcp-au-122 Documents $ false sashan@dhcp-au-122 Documents 1 $ 

并在git目录中看到分支名称:

 sashan@dhcp-au-122 rework mybranch $ 

不同之处在于PS1是使用的实际提示string,而PROMPT_COMMAND是在提示符之前执行的命令。 如果你想build立一个提示最简单,最灵活的方式,试试这个:

把这个放在你的.bashrc中:

 function prompt_command { export PS1=$(~/bin/bash_prompt) } export PROMPT_COMMAND=prompt_command 

然后写一个脚本(bash,perl,ruby:你的select),并把它放在〜/ bin / bash_prompt中。

该脚本可以使用任何信息来构build提示。 这比IMO简单得多,因为你不必学习为PS1variables开发的巴洛克式替代语言。

您可能会认为只需将PROMPT_COMMAND直接设置为〜/ bin / bash_prompt,并将PS1设置为空string即可。 这起初看起来很有效,但是很快你会发现,readline代码希望PS1被设置为实际的提示符,而当你在历史中滚动后字时,事情就会变得混乱起来。 此解决方法使PS1始终反映最新提示(因为该函数设置shell的调用实例使用的实际PS1),这使readline和命令历史logging正常工作。

man bash

PROMPT_COMMAND

如果设置,则在发出每个主要提示之前,将该值作为命令执行。

PS1

该参数的值被展开(请参阅下面的“PROMPTING”)并用作主提示string。 默认值是''\ s- \ v \ $''。

如果你只是想设置提示string,单独使用PS1就足够了:

 PS1='user \u on host \h$ ' 

如果您想在打印提示之前执行其他操作,请使用PROMPT_COMMAND 。 例如,如果要将caching写入同步到磁盘,可以写入:

 PROMPT_COMMAND='sync'