这是我的尝试:
最后一个有效,但它破坏了复制粘贴(复制时添加了大量空格)。有没有更好的办法?
可复制文本:
$ PS1='\['$'\x1b[0m\]$ '
$ echo -e "\x1b[41;37mWarning text\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[47;30m"; tr </dev/zero \\0 \ |head -c 80; echo -ne "\x1b[A"; echo Normal text
Warning text
Normal text
$
$ t="Warning text";echo -ne "\x1b[41;37m";echo -n "$t";{ tr </dev/zero \\0 \ |head -c $(bc <<<"$(stty -a <&3|grep -Po '(?<=columns )[0-9]+')-$(wc -c<<<"$t")+1"); } 3<&0;echo -e "\x1b[0m";echo "Normal text"
Warning text
Normal text
$
答案1
我自己找到了解决方案(在这个相关问题)。用这个:
echo -e '\x1b[41;37mWarning text\x1b[K\x1b[0m';echo Normal text
该文档说\x1b[K
:
K EL Erase line (default: from cursor to end of line).
ESC [ 1 K: erase from start of line to cursor.
ESC [ 2 K: erase whole line.
答案2
清除到行尾将使用 xterm 和 Linux 控制台以及复制该行为的终端的当前背景颜色。在 ncurses 中,这称为背景颜色擦除 (bce) 功能。当支持该功能时,这提供了一种使当前编辑的行的背景保持给定颜色的方法。
然而:
- 编辑换行时它的用处不大。
- 与 rxvt/urxvt 终端有一些区别:相关的擦除字符 (ech) 功能不使用背景颜色。您的 shell 在编辑行时可能会使用它。
- 并非所有终端在滚动时都使用当前背景颜色(如 xterm 和 Linux 控制台那样)。
进一步阅读:
答案3
这个怎么样:
printf '\e[41m%-*s\e[0m\n' $COLUMNS 'Warning text'
您还可以将其设为接受参数、添加颜色变量等的函数:
linecolor () { printf '\e[41m%-*s\e[0m\n' $COLUMNS "$1"; }
用法:
linecolor 'Warning text'
答案4
如果额外的初始空行是可以接受的:
echo -e "\x1b[41;37m\n\x1b[0m\x1b[41;37mWarning\x1b[0m"; echo "Normal"
似乎有效。
对于我所看到的行为,我能想到的唯一解释是,它取决于终端如何确定新行使用哪种背景颜色,如果您使用与我xterm
使用的不同的终端,那么它的工作方式可能会有所不同。
我认为使用printf
使你最后一个方法更具可读性,所以即使这仍然破坏复制粘贴,这里是:
printf "\x1b[41;37m%-$(stty size | cut -d' ' -f2)s\x1b[0m\n" hello; echo world; echo test