なんらかのネガティブエコーを使用して、以前のエコーと同じ場所にコンソールで何かを印刷します


9

bashでは、clearすべての画面コマンドをクリアするという名前のコマンドをキャストできます。

そして、echoあなたはあなたが望むものを画面上に印刷することができます。

私の単純なスクリプトでは、コマンドで行われていることの割合を出力する必要があることがよくあります。

だから私は何かをすることができました...

echo "89%"
echo "90%"
echo "91%"

等々..

私が嫌いなのは、画面がパーセント更新でいっぱいになることです...

89%
90%
91%
...

bashまたはphpエコーでエコーできる特別な文字の組み合わせ(たとえば、「\ 033 [01; 31m」)があるかどうかを確認し、コンソールに「最後に印刷された文字を削除する」と伝えます。

次のようなものを使用してそうします:(phpの例)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

画面に行をいっぱいにせずに、新しい文字列を前の文字列の正確な位置に印刷します

それ以外の場合は、常にbashおよびphpスクリプトを使用して他の方法で同じことを行う方法を探します(少なくともdebian9コンソールとphp7で実際の実際の例を含めてください)

回答:


24

これを行う一般的な方法は、1文字を消去するのではなく、改行(\r)を使用して行の先頭に戻ることです。

printf "89%%"; sleep 1; printf "\r90%%\n"

これは線をクリアするものではないので、必要に応じて注意する必要があることに注意してください。単純なオプションは、末尾にスペースを追加するか、出力を固定幅にすることです(たとえばprintf "%2d%%\n" 1、先行スペースを与える)。

画面の一部を移動してクリアできるターミナルエスケープ、CSIシーケンスがありますが、それらはターミナルに依存しています(ただし、実際にはVT100エスケープはどこでもサポートされています)。例えば

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

を使用␛[3Dして3文字を左に移動し、それらを上書きします(printfサポートを想定\e)。

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

を使用␛[0Eして、現在の行の先頭に移動し、行␛[Kの末尾に移動します(端末がこれらのシーケンスをサポートしている場合)。

tputprintfこれらのシーケンスにアクセスするための、端末に依存しない方法を提供します。

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

現在の端末に適切な文字シーケンスを使用して、カーソルを左に3回移動しcub 3el)、行の終わりまでクリアします()。

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

カーソルを左端の列(hpa 0)に移動し、行末までクリアします。

man terminfoで使用する「機能名」がわかりますtput

(上記の例の詳細の多くは、すべての出力が同じ行にあることを前提としています。これらは、さまざまなアプローチを説明するためだけに、間違いがないとは限りません。)

PHPスクリプトで同様の画面制御を行うには、PECL ncurses拡張機能を確認します。


5
一つは、通常使用することができるtput cub 3移動する rsorのBの配列をハードコーディングすることなく、3列によりACKを(とtput elE RASE リットル INEを)。
ステファンChazelas

1. \eポータブルではない2.どちらでもない\e[0E
スティーブンペニー

@Stevenに感謝します。シーケンスは端末依存であると述べましたが、修飾子をいくつか追加しました。
スティーブンキット2018

ech消去に使用できます。そして、3ポジション後方に移動することには問題があり、フルスクリーンプログラムが使用する2つの最適化が考えられます。しかし、固定幅のフォーマット指定子を使用するというアドバイスに従うと、最適化と消去の両方が単純な現在の行のみの端末のものには過剰です。100ちなみに、これは3桁の長さであることを忘れないでください。(-:
JdeBP 2018

良い点@JdeBP、ありがとう。100%に達したら、進行状況の更新が不要になることを願っています;-)。
スティーブンキット2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.