这种情况发生在Linux上,而不是Mac上。当我使用tput setaf
然后使用tput sgr0
时,光标仍然保留在之前选择的颜色中,直到我再次按下返回。我可以通过echo ''
以相同的方式重置它,但这并不理想,因为它为我创建了一个新行。使用printf
也无效。
如何重置shell中的光标颜色?
答案 0 :(得分:5)
tput sgr0
将设置恢复为默认颜色 - 它对我来说很好(我不需要其他回声)。
为了解决您的情况,我建议使用此代码:
tput setaf 2 && echo -en 'Name: ' && tput sgr0 && echo ""
答案 1 :(得分:2)
echo -n -e '\e[?0c'
截至今天, a ge tty 的当前版本(包含在util-linux 2.27.1
[util-linux]中是提供大多数核心命令的linux软件包,例如login
,su
,mount
,more
,kill
- 仅举几例] - 如果你的linux内核版本是> =你应该拥有它4.4)具有与尚未更新的kernel.org文档(Software cursor for VGA)中描述的行为不同的行为。
考虑
echo -n -e '\e[?
字节1 ;
字节2 ;
字节3 c'
字节1:
+---------------+---------------+
| high nibble | low nibble |
+---+-----------+-----------+---+
|msb| | |lsb|
+---+---+---+---+---+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+
| | | |
| | | +-+
| | | | These bits specify the 8
| | +-----+-> possible blinking HW carets
| | |
| +---------+
|
+---------------> When set, this bit enables SW
caret instead of HW caret
byte2(SW插入符号):
+-----------------> A pretty useless mask applied
| to bits in byte3
+---------------+---------------+
| high nibble | low nibble |
+---+-----------+-----------+---+
|msb| | |lsb|
+---+---+---+---+---+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+
byte3(SW插入符号):
+---------------+---------------+
| high nibble | low nibble |
+---+-----------+-----------+---+
|msb| | |lsb|
+---+---+---+---+---+---+---+---+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+
| | | |
| | | +-------------------> Highlighting
| | |
| | +---------------------+
| | |
| +-------------------------+-> Color
| |
+-----------------------------+
突出显示:高亮显示插入符号下方的字符(例如,将其更改为白色[真正闪亮的白色]而不是深白色[浅灰色,这通常是TTY的默认值])。
颜色:插入符号的颜色。请注意,与我们都知道和喜欢的ANSI颜色代码的通常顺序相比,位反转,所以 - 对于这个三元组 - 第7个是 L sb而第5个是 M 强> SB。
因此,在70年代,ANSI定义了以下颜色代码,为TTY设置了一个普遍采用的事实标准,各种linux终端,控制台等等
000 (0) black
001 (1) red
010 (2) green
011 (3) yellow or dark yellow
100 (4) blue or dark blue
101 (5) magenta, purple or violet
110 (6) cyan or light blue
111 (7) white or dark white (light gray)
在这种情况下我们有相反的
000 (0) black
100 (4) red
010 (2) green
110 (6) yellow or dark yellow
001 (1) blue or dark blue
101 (5) magenta, purple or violet
011 (3) cyan or light blue
111 (7) white or dark white (light gray)
(括号中的八进制值)
所以,列表如下:
#Hardware carets (blinking and [dark ]white)
echo -n -e '\e[?0c' #default caret
echo -n -e '\e[?1c' #invisible caret
echo -n -e '\e[?2c' #underscore caret
echo -n -e '\e[?3c' #thicker underscore caret
echo -n -e '\e[?4c' #smaller block caret
echo -n -e '\e[?5c' #small block caret
echo -n -e '\e[?6c' #big block caret
echo -n -e '\e[?7c' #biggest block caret
#On my Linux machine, both 6 and 7 are the big rectangular full-size block caret
#Software carets (non-blinking and colored)
echo -n -e '\e[?16;0;0c' #00001000 0 00000000 black (thus invisible on black background)
echo -n -e '\e[?16;0;128c'#00001000 0 10000000 red
echo -n -e '\e[?16;0;64c' #00001000 0 01000000 green
echo -n -e '\e[?16;0;192c'#00001000 0 11000000 yellow
echo -n -e '\e[?16;0;32c' #00001000 0 00100000 blue
echo -n -e '\e[?16;0;160c'#00001000 0 10100000 magenta
echo -n -e '\e[?16;0;96c' #00001000 0 01100000 cyan
echo -n -e '\e[?16;0;224c'#00001000 0 11100000 dim white
echo -n -e '\e[?16;0;16c' #00001000 0 00010000 black + highlighting
echo -n -e '\e[?16;0;144c'#00001000 0 10010000 red + highlighting
echo -n -e '\e[?16;0;80c' #00001000 0 01010000 green + highlighting
echo -n -e '\e[?16;0;208c'#00001000 0 11010000 yellow + highlighting
echo -n -e '\e[?16;0;48c' #00001000 0 00110000 blue + highlighting
echo -n -e '\e[?16;0;176c'#00001000 0 10110000 magenta + highlighting
echo -n -e '\e[?16;0;112c'#00001000 0 01110000 cyan + highlighting
echo -n -e '\e[?16;0;240c'#00001000 0 11110000 dim white + highlighting
答案 2 :(得分:0)
是否可以,如何可以更改文本光标颜色完全取决于终端模拟器。没有与此功能对应的terminfo / termcap功能。
xterm
是(少数)可以做到这一点的人之一。它被记录为动态颜色功能之一,例如来自 XTerm Control Sequences
OSC Ps ; Pt BEL
设置文本参数。对于颜色和字体,如果 Pt 是“?”,则 控制序列引发一个响应,该响应由控制序列组成,该控制序列将设置相应的值。该 dtterm控件序列允许您确定图标名称 和窗口标题。
Ps = 1 2 - >将文本光标颜色更改为 Pt 。
xtermset
程序知道如何设置此功能和类似功能。如果没有指定光标颜色,xterm
会尝试使用单元格前景色和背景色的反转来保持光标始终可见。
除了rxvt-unicode( XTerm操作系统命令下的documents功能)之外,其他一些终端仿真器可能会实现相同的功能。但是,通常的“MAC”程序(Terminal.app和Iterm2)不支持这些控制序列。 Iterm2将其标记为"future release"。
使用xtermset
,您可以使用
xtermset -cr green
它实际上并没有“多”:xterm
接受一个可以放在脚本中的控制序列
printf '\033]12;green\007'
其中“033]
OSC (操作系统控制前缀)和\007
是结束序列所接受的后缀之一。 printf(转义反斜杠)中的字符串终止符 \033\\
将是首选,因为它是ECMA-48中的标准。
答案 3 :(得分:0)
只需使用重置命令:
reset
“ BSD / Linux / UNIX操作系统下的reset命令用于将控制台恢复到正常状态。这在程序死后使终端处于异常状态时非常有用。”