Axe*_*ton 4 bash terminal cursor
使用简单的ANSI 转义序列应该可以保存和恢复光标位置
ANSI 转义序列允许您在屏幕上随意移动光标。这对于 shell 脚本生成的全屏用户界面更有用,但也可以在提示中使用。运动转义序列如下:
- [...]
- 保存光标位置:
\033[s- 恢复光标位置:
\033[u
然而,这个 ANSI 序列似乎只恢复光标的水平位置。例如:
$ printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Doing some task...
More text
done!
$
Run Code Online (Sandbox Code Playgroud)
其中done!水平位于正确位置,但垂直方向不正确(在恢复的意义上是正确的)。
done!在之后打印task...?我搜索并阅读了许多问题,但我没有找到任何关于我经历过的这种行为的信息。tput实际上, via也会发生同样的情况
$ printf 'Doing some task...'; tput sc; printf '\n\nMore text\n'; tput rc; printf 'done!\n\n\n'
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?你能重现这个吗?!
如果我位于终端底部并且下一行使内容向上移动,我可以。但在同时不滚动的终端中重复测试。点击Ctrl+ L(或调用clear)并从顶部开始。然后它的行为就会如你所愿。
这是预期的行为吗?
我想是这样。光标位置是相对于屏幕的,而不是相对于屏幕内容的。
done!之后如何打印task...?
可能的方法:如果您知道要打印不超过 6 行并且终端足够大,请先打印 6 个空行,以便它先滚动,然后向上移动光标,然后才打印有意义的文本:
printf '\n\n\n\n\n\n'; printf '\033[6A'; printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Run Code Online (Sandbox Code Playgroud)
我使用了三个单独的printfs 来展示逻辑,但也可以是一个。