Bash

清除 bash 中的舊提示行以節省滾動空間

  • February 11, 2014

我的終端主題曾經是這樣的,

之前終止他們

但我認為提示浪費了太多空間。後來我有了一個想法,每次執行命令時我都可以清理提示。我正在使用 bash,解決方案之一是使用該preexec_invoke_exec功能。

我使用以下命令清除最後一個提示字元:

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"

這樣終端就很乾淨了,像這樣,

在此處輸入圖像描述

但是現在我的問題是,如果我想在一行中使用多個命令,比如當我使用for i in ....

這是我的 .bashrc 中函式的完整版本,

preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne "  \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; }
preexec_invoke_exec () {
   [ -n "$COMP_LINE" ] && return  # do nothing if completing
   [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
   local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
   local this_pwd=`pwd`; 
   preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG

首先preexec_invoke_exec必須進行修改以防止多次執行preexec. 此外,修改preexec以考慮實際的行數$PS1

preexec () { 
   # delete old prompt; one "\e[1A\e[K" per line of $PS1
   for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
   do             
       echo -ne "\e[1A\e[K"
   done
   # replacement for prompt
   echo -ne "\e[31;1m$ \e[0m"
   echo -n "$1"
   echo -ne "  \e[37;2m["
   echo -n "$2"
   echo -e "]\e[0m"
}

preexec_invoke_exec () {
   [ -n "$DONTCLEANPROMPT" ] && return
   DONTCLEANPROMPT=x
   [ -n "$COMP_LINE" ] && return  # do nothing if completing
   [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
   local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
   local this_pwd=`pwd`
   preexec "$this_command" "$this_pwd"
}

trap 'preexec_invoke_exec' DEBUG

PROMPT_COMMAND='unset DONTCLEANPROMPT'

為了preexec再次執行,DONTCLEANPROMPT必須取消設置或設置為''. 這是使用 完成的PROMPT_COMMAND,它在發出主要提示之前執行。因此preexec,每個命令行將執行一次且僅執行一次。

引用自:https://unix.stackexchange.com/questions/107080