答案1
\n
不应该清除到行尾,而是保持内容不变。独立命令
printf 'abcdef\rghi\n'
最终打印ghidef
而不是ghi
,这是设计使然的。\r
将光标移动到行首,ghi
覆盖abc
,但def
保留在那里。
要清除到行尾,可以使用\e[K
(擦除行中)转义序列。所以这个命令最终显示ghi
:
printf 'abcdef\r\e[Kghi\n'
(注意:\e[K
在行的开头发出,而不是在新文本的末尾发出,因为如果光标即将换行到下一行,则序列的行为会出现混乱。换句话说,您可能会遇到如果新文本恰好与您的终端一样宽,则会出现视觉故障。具体的行为甚至因终端模拟器而异。)
更复杂的是,您打印的内容显然不会直接进入终端,但不知何故,某些 Docker 组件会在前面添加青色test |
文本。执行此前置操作的引擎显然没有准备好进行正确处理\r
,因此您很可能无法实现覆盖先前输出的“正确”行为。如果这个理论得到证实,那么可能值得对执行此操作的软件提出功能请求;对于该软件test |
来说,在\r
.