清除 bash 中的旧提示行以节省滚动空间

Lib*_*Wen 11 shell bash prompt terminal

我的终端主题曾经是这样的,

在他们之前结束

但我认为提示浪费了太多空间。后来我有了一个想法,每次运行命令时我都可以清除提示。我正在使用 bash,解决方案之一是使用该preexec_invoke_exec功能。

我使用以下命令清除最后一个提示字符:

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"
Run Code Online (Sandbox Code Playgroud)

这样终端就很干净了,像这样,

在此处输入图片说明

但是现在我的问题是,如果我想在一行中使用多个命令就会出现问题,比如说,当我使用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
Run Code Online (Sandbox Code Playgroud)

Ada*_*hon 3

首先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'
Run Code Online (Sandbox Code Playgroud)

为了preexec再次运行,DONTCLEANPROMPT必须取消设置或设置为''。这是通过 完成的PROMPT_COMMAND,它在发出主提示之前运行。因此,preexec每个命令行都会运行一次且仅运行一次。