Bash

保存後恢復游標位置

  • February 3, 2020

使用簡單的ANSI 轉義序列應該可以保存和恢復游標位置

ANSI 轉義序列允許您隨意在螢幕上移動游標。這對於由 shell 腳本生成的全屏使用者界面更有用,但也可以在提示中使用。運動轉義序列如下:

  • $$ … $$
  • 保存游標位置:\033[s
  • 恢復游標位置:\033[u

來源:Bash Prompt HOWTO:游標移動

但是,這個 ANSI 序列似乎只恢復游標的水平位置。例如:

$ printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Doing some task...

More text
                 done!


$

其中done!水平在正確的位置但不是垂直的(在恢復的意義上是正確的)。

  1. 我錯過了什麼,即你能重現這個嗎?!
  2. 這是預期的期望行為嗎?如果是這樣,我將如何在done!之後列印task...
  3. 如果這不應該發生,這種行為可能是由我的環境中的某些東西間接觸發的嗎?

我搜尋並閱讀了許多有關的問題,但我沒有找到任何關於我所經歷的這種行為的任何資訊。實際上,同樣的情況也發生在tputvia

$ printf 'Doing some task...'; tput sc; printf '\n\nMore text\n'; tput rc; printf 'done!\n\n\n'

我錯過了什麼,即你能重現這個嗎?!

我可以,如果我在終端的底部並且下一行使內容向上移動。但是在同時不滾動的終端中重複測試。點擊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'

我使用了三個單獨printf的 s 來顯示邏輯,但它可能是一個。

引用自:https://unix.stackexchange.com/questions/565597