终端是否会默默地忽略多余的转义序列?
#!/bin/sh
printf "\033[?25l"
printf "\033[?25l" # superfluous
printf "\033[31m"
printf "\033[31m" # superfluous
printf "Red Text\n"
sleep 1
printf "\033[0m"
printf "\033[?25h"
答案1
是的,他们确实这么做了。
您可能熟悉某些文档格式,例如 HTML,其中开始和结束标记需要彼此对应。例如,这没关系:
<font style="color:red"><font style="color:red">foobar</font></font>
但这不是,因为标签不平衡:
<font style="color:red"><font style="color:red">foobar</font>
终端仿真是不是像这样。终端模拟器不会立即看到整个“文档”,而是随着时间的推移看到传入的流。
终端仿真器是一个状态机。完整的转义序列,例如\033[?25l
或\033[31m
不打开或关闭上下文,它们只是设置某个新状态。第一个示例使光标不可见,第二个示例切换为红色字体。您可能会多次执行它们,光标不会变得更加不可见,文本也不会变得更加红色,这些指令的实例也不会保留在堆栈上的某处。这些是一次性分配:光标不可见(无论其先前的状态是什么),并且打印后续文本的颜色切换为红色(同样:无论其先前的状态是什么)。
只有少数转义序列具有某种打开-关闭语义,例如,您可以将当前窗口标题压入堆栈,然后从那里弹出它,显然这些应该成对使用。