回答:
キャリッジリターンを\ rでエコー
seq 1 1000000 | while read i; do echo -en "\r$i"; done
男のエコーから:
-n do not output the trailing newline
-e enable interpretation of backslash escapes
\r carriage return
キャリッジリターン自体は、カーソルを行の先頭に移動するだけです。出力の新しい各行が少なくとも前の行と同じ長さであれば問題ありませんが、新しい行が短いと、前の行は完全に上書きされません。たとえば、次のようになります。
$ echo -e "abcdefghijklmnopqrstuvwxyz\r0123456789"
0123456789klmnopqrstuvwxyz
新しいテキストの行を実際にクリアするには、次のように追加\033[K
します\r
。
$ echo -e "abcdefghijklmnopqrstuvwxyz\r\033[K0123456789"
0123456789
\e[K
代わりに短縮できます\033[K
。
\033[G
ioを実行することもできますが、明らかにはるかに簡単です。また、invisible-island.net / xterm / ctlseqs / ctlseqs.htmlは、ウィキペディアより詳細で、xterm開発者によるものです。\r
\033[K
\r
Derek Veitの回答は、行の長さが端末の幅を超えない限り有効です。そうでない場合は、次のコードでジャンク出力を防止します。
行が初めて書かれる前に、
tput sc
現在のカーソル位置を保存します。行を印刷したいときはいつでも、
tput rc
tput ed
echo "your stuff here"
最初に保存されたカーソル位置に戻り、次に画面をカーソルから下に消去し、最後に出力を書き込みます。
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
ではなくを使用する必要がありますtput el
。@Umの例が使用さed
れています(コメントした後で修正した可能性があります)。
\ 033の方法ではうまくいきませんでした。\ rメソッドは機能しますが、実際には何も消去せず、カーソルを行の先頭に置きます。したがって、新しい文字列が古い文字列よりも短い場合は、行末に残ったテキストが表示されます。結局、tputが最善の方法でした。カーソルのほかに他の用途があり、多くのLinuxおよびBSDディストリビューションにプリインストールされているため、ほとんどのbashユーザーが利用できます。
#/bin/bash
tput sc # save cursor
printf "Something that I made up for this string"
sleep 1
tput rc;tput el # rc = restore cursor, el = erase to end of line
printf "Another message for testing"
sleep 1
tput rc;tput el
printf "Yet another one"
sleep 1
tput rc;tput el
以下は、小さなカウントダウンスクリプトです。
#!/bin/bash
timeout () {
tput sc
time=$1; while [ $time -ge 0 ]; do
tput rc; tput el
printf "$2" $time
((time--))
sleep 1
done
tput rc; tput ed;
}
timeout 10 "Self-destructing in %s"
進行状況の出力が複数行である場合、またはスクリプトがすでに改行文字を印刷している場合は、次のような行にジャンプできます。
printf "\033[5A"
カーソルが5行上にジャンプします。その後、必要なものを上書きできます。
それがうまくいかない場合は、printf "\e[5A"
またはを試してみてくださいecho -e "\033[5A"
。同じ効果があります。
基本的に、エスケープシーケンスを使用すると、画面内のほぼすべてを制御できます。
tput cuu 5
で、5は行数です(上cuu
に移動する、下cud
に移動する)。
for i in {1..100000}; do echo -en "\r$i"; done
seqコールを回避するには:-)