在創建倒數計時器時重擊,我想出了以下代碼:
for ((n=15; n > 0; n--)); do
printf "Reload | $n" && sleep 1
done
這作業正常,它不斷添加printf到同一行,正如預期的那樣。
所以我打開了檔案,tput發現:
tput el1清除到行首
并試了一下:
for ((n=15; n > 0; n--)); do
tput el1; printf "Reload | $n" && sleep 1
done
但是,這會在每次迭代中添加一個選項卡,因此輸出變為:
Reload | 15
Reload | 14
Reload | 13
這些輸出在同一行,因此“清除”有效,但由于某種原因,游標未恢復到第一列。
\r我設法通過在后面添加回車()來修復它printf:
for ((n=15; n > 0; n--)); do
tput el1; printf "Reload | $n\r" && sleep 1
done
我已經閱讀了很多檔案,但無法理解為什么\r這里需要。請向我指出有關此問題的正確檔案/副本。
uj5u.com熱心網友回復:
比較el1
tput el1
Clear to beginning of line
和clear
tput clear
clear screen and home cursor
請注意,clear明確宣告它移動游標;el1才不是。它只洗掉行首和當前游標位置之間的當前行上的任何內容,將游標留在后面的文本所在的位置。
另一方面,回車通常被解釋為將游標移動到當前行的開頭而不前進到下一行。相應的終端能力將是cr。
一個更強大的解決方案是先移動游標,然后清除到行尾,最后輸出下一段文本。這可以處理新文本比以前短的情況,當您從兩位數切換到一位數時,這將是一個問題。
for ((n=15; n>0; n--)); do
tput cr el; printf "Reload | -" "$n"; sleep 1
done
(這-是為了確保個位數的值不會向左“跳”一個空格。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/478758.html
下一篇:bash如何處理決議錯誤?
