如何在 bash 中添加一条从我左手边 PS1 文本末尾到右手边的连续行

如何在 bash 中添加一条从我左手边 PS1 文本末尾到右手边的连续行

我很难理解这个小问题

基本上我使用这个 bash PS1 脚本因为它很酷:

PS1="\n \[\033[0;34m\]╭─────\[\033[0;31m\]\[\033[0;37m\]\[\033[41m\] \u \[\033[0m\]\[\033[0;31m\]\[\033[0;34m\]─────\[\033[0;32m\]\[\033[0;30m\]\[\033[42m\] \w \[\033[0m\]\[\033[0;32m\] \n \[\033[0;34m\]╰ \[\033[1;36m\]\$ \[\033[0m\]"

看起来像这样:

类似电力线的 bash

我想要做的是在右侧打印一个时间戳,并用一条实线连接左侧的末尾和文本右侧的开头,例如:

ben @ local ------------------------------------------12:00pm

我尝试这样做:

$(printf '%*s' $COLUMNS  '-')

但这显然只是创建了一条充满破折号的全新线条。

我如何获取光标停止位置的值?我知道,tput sc但我不明白如何在变量中使用它?然后打印行,在右侧留下大约 5 个字符作为时间。

这是我第一次尝试 Bash 脚本,所以请原谅我的无知。

任何帮助表示感谢

答案1

首先,您必须从提示字符串中去除转义序列并将其扩展以获取实际长度以减去列长度。

prompt_handler(){
    local A="$2[\A]"

    while [[ $A =~ \\[\x1b\\[[0-9\;]*m\\] ]]; do
       A=${A//"${BASH_REMATCH}"}
    done

    A=${A@P} \
    A=$((COLUMNS-${#A}))

    eval printf \
        -v A ─%.s {1..$A}

    PS1="$1$2${A}[\A]$3"
}

PROMPT_COMMAND='prompt_handler "\n" " \[\033[0;34m\]╭─────\[\033[0;31m\]\[\033[0;37m\]\[\033[41m\] \u \[\033[0m\]\[\033[0;31m\]\[\033[0;34m\]─────\[\033[0;32m\]\[\033[0;30m\]\[\033[42m\] \w \[\033[0m\]\[\033[0;32m\]" "\n \[\033[0;34m\]╰ \[\033[1;36m\]\$ \[\033[0m\]"'

相关内容