scpなどの多くのプログラムと同様に、シェルで STDOUT に書き込まれた行を変更することはできますか?
ポイントは、画面全体をスクロールすることなく、本質的にティッカーまたは何らかのモニターを使用できるようにすることです。
制御文字とANSI エスケープ コードを使用して端末を操作できます。たとえば\b
、カーソルを 1 つ戻して、行頭に\r
戻します。これは、単純なティッカーを作成するために使用できます。
for i in $(seq 10)
do
echo -en "Progress... $i\r" # -e is needed to interpret escape codes
sleep 1
done
echo -e "\nDone."
ANSI エスケープ コードを使用すると、画面の一部をクリアしたり、任意の位置にジャンプしたり、出力色を変更したりできます。
文字を印刷することで、最後に印刷された行を上書きできます\r
。
たとえば、これ:
for i in `seq 1 10`; do
echo -n $i;
sleep 1;
echo -n -e "\r" ;
done
10まで印刷1
してから更新し2
ます。
パイプラインで別のプログラムを使用して stdout の出力を変更できます。使用するプログラムを実行すると | 入力を次のプログラムにパイプします。次のプログラムは、出力に対して必要なことを何でも行うことができます。プログラムの出力を変更するための汎用プログラムは sed です。または、前のプログラムのデータを変更する何かを自分で作成することもできます。
シェル プログラムは次のようになります。
while read line; do
# do something with $line and output the results
done
だからあなたはただすることができます:
the_original_program | the_above_program