Bash
保存後恢復游標位置
使用簡單的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! $
其中
done!
水平在正確的位置但不是垂直的(在恢復的意義上是正確的)。
- 我錯過了什麼,即你能重現這個嗎?!
- 這是預期的期望行為嗎?如果是這樣,我將如何在
done!
之後列印task...
?- 如果這不應該發生,這種行為可能是由我的環境中的某些東西間接觸發的嗎?
我搜尋並閱讀了許多有關的問題,但我沒有找到任何關於我所經歷的這種行為的任何資訊。實際上,同樣的情況也發生在
tput
via$ 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 來顯示邏輯,但它可能是一個。