1. ホーム
  2. bash

[解決済み] エコーの表示と更新を同じ行で行う方法

2022-05-14 10:05:16

質問

私はBashで以下を持っています (Linuxの場合)

for dir in Movies/*
do
  (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist &&
  exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist )
echo "Movie $movies - $dir ADDED!"
let movies=movies+1
done

しかし、私は、"echo"が次の行に次のechoを表示するようにしたい(最後のecho出力と連結するのではなく、置き換える)ので、それが更新されているように見えるようにします。パーセントのプログレスバーが同じ行に表示されるのと同じようなものです。

どのように解決するのですか?

さて、私は正しく読んでいなかった man echo のページを正しく読んでいませんでした。

echoには、3番目のエスケープ文字を追加すれば、これを実行できる2つのオプションがありました。

2つのオプションは -n-e .

-n のようにすると、末尾の改行が出力されなくなります。そのため、何かをエコーするたびに改行する手間が省けます。

-e はバックスラッシュのエスケープ記号を解釈できるようにします。

これにはどのようなエスケープシンボルを使うか当ててみてください。 \r . そう、キャリッジリターンを使うと最初に戻ってしまうので、視覚的に同じ行で更新しているように見えてしまうのです。

つまり、エコー行は次のようになります。

echo -ne "Movie $movies - $dir ADDED!"\\r

Bash に殺されないように、エスケープシンボルをエスケープする必要がありました。 \ という記号が2つあるのはそのためです。

ウィリアムが言っていたように printf はこのような似たような(そしてさらに広範囲な)作業を行うこともできます。