我很难理解这个小问题
基本上我使用这个 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\]"
看起来像这样:
我想要做的是在右侧打印一个时间戳,并用一条实线连接左侧的末尾和文本右侧的开头,例如:
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\]"'