在PROMPT_COMMAND中维护唯一条目

时间:2016-11-09 22:38:34

标签: bash

只有一个.apk,它在显示提示之前运行。要添加要运行的命令,典型的方法是:

PROMPT_COMMAND

问题是即使已添加PROMPT_COMMAND="my_command; $PROMPT_COMMAND" ,此行也会添加my_command。我非常希望在更新它之后使用~/.bashrc来源,而不是让事情中断或执行冗余。通过.bashrc中的上述内容,PROMPT_COMMAND扩展为mycommand; mycommand; mycommand; mycommand; ...

我的一个想法是根据;拆分并重新组合:

PROMPT_COMMAND=$( echo "$PROMPT_COMMAND" | sed 's/^ *\(.*[^ ]\) *$/\1/' | sed 's/ *; */\n/g' | sed '/^$/d' | sort -u | tr '\n' ';' )

但是有些命令在字符串和子shell命令中包含;,这会破坏上面的内容,因为引号,括号和转义字符会被忽略。如何干净地维护多个PROMPT_COMMAND

2 个答案:

答案 0 :(得分:0)

此功能只有在PROMPT_COMMAND不存在的情况下才会附加一些。

function prompt_command_push() {
    if [[ "$PROMPT_COMMAND" != *"$@"* ]]; then
        if [[ -n "$PROMPT_COMMAND" ]]; then
            export PROMPT_COMMAND="$PROMPT_COMMAND;$@"
        else
            export PROMPT_COMMAND="$@"
        fi
    fi
}

prompt_command_push printf hello
prompt_command_push echo '\ world'

应该注意" $ @"作为字符串和转义序列的用法被解析两次。

此函数附加,而不是预先命令,以便最后执行最近的添加。

答案 1 :(得分:0)

我解决此问题的方法是创建 new 变量以保留原始 PROMPT_COMMAND变量的副本。

将其放入~/.bashrc文件中:

export ORIGINAL_PROMPT_COMMAND="${PROMPT_COMMAND}"
export PROMPT_COMMAND="my_command; ${ORIGINAL_PROMPT_COMMAND}"

这会导致您的my_command只执行一次,并且原始PROMPT_COMMAND将得到尊重。