如何自定义 $PROMPT_COMMAND 而不覆盖默认值(如果存在)?

如何自定义 $PROMPT_COMMAND 而不覆盖默认值(如果存在)?

Mac 的终端默认会PROMPT_COMMAND检查历史记录并更新当前工作目录(选项卡的标题):

添加echo $PROMPT_COMMAND到你的顶部.bash_profile你会看到:

shell_session_history_check; update_terminal_cwd

我想添加我自己的PROMPT_COMMAND而不覆盖默认值。默认值应该出现在我的自定义之前,PROMPT_COMMAND并用分号和空格将两者分开。

请注意,某些程序(例如 IntelliJ 和 VS Code)没有默认值!所以在这种情况下我不想包含空格/分号。

答案1

从 Bash 5.1 开始,PROMPT_COMMAND可以是数组;您可以添加自己的命令作为第一个执行的命令

PROMPT_COMMAND=(mycommand "${PROMPT_COMMAND[@]}")

如果 的现有值PROMPT_COMMAND在单个字符串中包含多个命令,这也适用。


对于较旧的 Bash,例如常用的 macOS bash,您可以使用参数扩展为此:+

${parameter:+word}
如果parameter为空或未设置,没有任何内容被替换,否则扩展word被替换。

一个例子:

$ unset var
$ var=${var:+"$var; "}XXX
$ echo "$var"
XXX
$ var=abc
$ var=${var:+"$var; "}XXX
$ echo "$var"
abc; XXX

因此,为了保留附加的现有命令;,我使用

PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'mycommand'

如果PROMPT_COMMAND之前为空,则mycommand后面包含,如果不是,;则插入到现有命令和 之间mycommand

答案2

# If PC contains anything, add semicolon and space
if [ ! -z "$PROMPT_COMMAND" ]; then
    PROMPT_COMMAND="$PROMPT_COMMAND; "
fi

# Add custom PC
PROMPT_COMMAND=$PROMPT_COMMAND'CUSTOM_PC_HERE'

相关内容