Bash完了機能中の出力テキスト

Bash完了機能中の出力テキスト

bash完了ツールがインストールされています。私が達成したい特定のフラグ値の1つは、サードパーティプログラムへの外部呼び出しを必要とし、これは非常に遅いです。でも大丈夫です。すべて動作します。いくつかのローカルファイルキャッシュを追加することで、私のツールユーザーは数日に一度だけこのファイルをチェックするだけです。

問題は、遅い速度がユーザーにあまり慣れていないように見えることです。私は、ユーザーがキャッシュがどのように機能するかを知る必要がないことを願っています。ただし、キャッシュが汚れている場合は、書き換えるのに約15秒待つ必要があります。このデータをロードしていることを示すために何かを追加したいと思います。

単純なものを追加しようとしましたが、興味深いことに、タブをecho "Querying <third party tool>..."もう一度クリックするまで完了結果が実際には表示されないようです(おそらくキャッシュが汚れたときにのみエコーされ、タブを2回クリックするとキャッシュされた読み取りから直接開始されるため)。 )。 stderrにエコーしようとしましたが、同じ結果が得られました。

タブの読み込みが完了すると、他のツールに読み込みアイコンが表示されるのを見たことがあります。gcloud完了すると表示されることは注目に値します--project。しかし、私は彼らがどのようにこれを行うかについての兆候を見つけることができませんでした。

答え1

以下は少しアニメーションです。

animation() {
  tput civis
  while true; do
    for i in {1..3}; do
      echo -ne "."
      sleep 1
    done
    for i in {1..3}; do
      echo -ne "\b \b"
      sleep 1
    done
  done
  tput civvis
}

kill_animation() {
  kill $anim
  echo
}

echo -n "Loading" && animation & anim=$!

sleep 10

kill_animation

結果は次のとおりです。

ここに画像の説明を入力してください。

答え2

いくつかの実験の終わりに効果があることがわかりました。デフォルトでは、アイデアは、作成したテキストにバックスペースを入力し、その上にスペースを入れてから、そのテキストにバックスペースを適用することです(エスケープはカーソル\bだけを移動しますが、削除しません)。

これがgcloudなどがテキストの代わりに単一の文字を表示する理由でもあります。私はBashの何かにアニメーションを適用したくなかったし、ロードを表す良い単一の文字を見ていないので、私がしたことは次のとおりです。

# \e[2m = dim, \e[0m = reset
echo -ne "\e[2mLoading...\e[0m"

# do the slow thing...

# same number of `\b` and ` ` as "Loading..."
echo -ne "\b\b\b\b\b\b\b\b\b\b          \b\b\b\b\b\b\b\b\b\b"

コードが見苦しい以外に見つかった問題はありません。

関連情報