clear
Bashでは、すべての画面消去コマンドと呼ばれるコマンドを実行できます。
echo
画面に希望の内容を印刷できます。
単純なスクリプトでは、コマンド実行率を印刷する必要があることがよくあります。
だから私は次のことができます...
echo "89%"
echo "90%"
echo "91%"
など..
私が嫌いなのは、画面が全体の割合で更新されることです...
89%
90%
91%
...
bashまたはphp echoでエコーし、コンソールに「最後に印刷された文字を削除してください。
これを使用してこれを行います:(phpの例)
echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;
画面を行で埋めることなく、古い文字列の正確な位置に新しい文字列を印刷します。
そうでない場合は、常にbashスクリプトとphpスクリプトを使用して他の方法で同じことを行う方法を探しています。 (少なくともdebian9コンソールとphp7を使って実際の作業例を含めてください。)
答え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
まで消去するために使用されます(ターミナルがこれらのシーケンスをサポートしていると仮定)。
tput
printf
これらのシーケンスにアクセスするための端末に依存しない方法を提供します。
printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"
現在の端末に合った文字シーケンスを使用してカーソルを左(cub 3
)に3回移動し、行末()まで消去します。el
printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"
カーソルを左端の列()に移動し、行のhpa 0
最後まで消去します。
man terminfo
どの「関数名」を使用すべきかを教えてくれますtput
。
(上記の例の多くの詳細は、すべての出力が同じ行にあると仮定しています。これは完璧ではなく、さまざまなアプローチを説明するためのものです。)
PHPスクリプトの同様の画面制御を表示するには、PECLを確認してください。ncurses
拡張する。