如何在 bash 中添加从左手 PS1 文本末尾到右手边的不间断行

use*_*535 5 command-line bash scripts

我很难集中注意力解决这个小问题

\n

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

\n
PS1="\\n \\[\\033[0;34m\\]\xe2\x95\xad\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;31m\\]\xee\x82\xb2\\[\\033[0;37m\\]\\[\\033[41m\\] \\u \\[\\033[0m\\]\\[\\033[0;31m\\]\xee\x82\xb0\\[\\033[0;34m\\]\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;32m\\]\xee\x82\xb2\\[\\033[0;30m\\]\\[\\033[42m\\] \\w \\[\\033[0m\\]\\[\\033[0;32m\\]\xee\x82\xb0 \\n \\[\\033[0;34m\\]\xe2\x95\xb0\xef\x91\xa0 \\[\\033[1;36m\\]\\$ \\[\\033[0m\\]"\n
Run Code Online (Sandbox Code Playgroud)\n

看起来像这样:

\n

像电力线一样的 bash

\n

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

\n
PS1="\\n \\[\\033[0;34m\\]\xe2\x95\xad\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;31m\\]\xee\x82\xb2\\[\\033[0;37m\\]\\[\\033[41m\\] \\u \\[\\033[0m\\]\\[\\033[0;31m\\]\xee\x82\xb0\\[\\033[0;34m\\]\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;32m\\]\xee\x82\xb2\\[\\033[0;30m\\]\\[\\033[42m\\] \\w \\[\\033[0m\\]\\[\\033[0;32m\\]\xee\x82\xb0 \\n \\[\\033[0;34m\\]\xe2\x95\xb0\xef\x91\xa0 \\[\\033[1;36m\\]\\$ \\[\\033[0m\\]"\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试这样做:

\n
$(printf \'%*s\' $COLUMNS  \'-\')\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

任何帮助表示赞赏

\n

小智 7

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

\n
prompt_handler(){\n    local A="$2[\\A]"\n\n    while [[ $A =~ \\\\[\\x1b\\\\[[0-9\\;]*m\\\\] ]]; do\n       A=${A//"${BASH_REMATCH}"}\n    done\n\n    A=${A@P} \\\n    A=$((COLUMNS-${#A}))\n\n    eval printf \\\n        -v A \xe2\x94\x80%.s {1..$A}\n\n    PS1="$1$2${A}[\\A]$3"\n}\n\nPROMPT_COMMAND='prompt_handler "\\n" " \\[\\033[0;34m\\]\xe2\x95\xad\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;31m\\]\xee\x82\xb2\\[\\033[0;37m\\]\\[\\033[41m\\] \\u \\[\\033[0m\\]\\[\\033[0;31m\\]\xee\x82\xb0\\[\\033[0;34m\\]\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\\[\\033[0;32m\\]\xee\x82\xb2\\[\\033[0;30m\\]\\[\\033[42m\\] \\w \\[\\033[0m\\]\\[\\033[0;32m\\]\xee\x82\xb0" "\\n \\[\\033[0;34m\\]\xe2\x95\xb0\xef\x91\xa0 \\[\\033[1;36m\\]\\$ \\[\\033[0m\\]"'\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这真的很整洁!不过,由于您正在使用许多人不知道的各种 bash 功能,因此一些解释会对它有所帮助。例如,我必须查找“${A@P}”,才能了解到它是一种特殊的扩展模式,可以使变量像提示字符串一样扩展。 (3认同)