2016-11-09 42 views
0

只有一個PROMPT_COMMAND,它在顯示提示之前運行。要添加命令來運行的典型方法是:在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

回答

0

該功能僅在PROMPT_COMMAND尚未存在的情況下才會附加提示。

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

prompt_command_push printf hello 
prompt_command_push echo '\ world' 

注意「$ @」用法作爲字符串和轉義序列被解析兩次。

該函數附加,而不是預先添加命令,以便最後執行最近的添加。

0

我解決這個問題的方法是創建一個新變量保留了原有PROMPT_COMMAND變量的副本。

將這個在您的~/.bashrc文件:

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

這將導致你的my_command只執行一次和原PROMPT_COMMAND將得到尊重。