Bash でテーブルのような CLI ディスプレイを作成する最適な方法は何ですか?

Bash でテーブルのような CLI ディスプレイを作成する最適な方法は何ですか?

私は、大規模な USB フラッシュ メモリのテスト (f3内部で使用) 用の Bash スクリプトを作成中です。複数の列とセルを持つテーブルのようなインターフェイスを表示する必要があります。

現在、私はprintfwith を使用しており、次のようになっています:

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

各ドライブに対して、ログ ファイルにテキストを書き出す個別の関数を実行しています。これらのログ ファイルは解析され、ユーザーに情報が表示されます。

ご覧のとおり、一部の行には本来あるべきではないオフセットがありますが、それを取り除くことができません。これは、長い文字列が印刷されたことが原因ではなさそうです。これが何なのかわかりません。

grep私が抱えているもう 1 つの問題は、リフレッシュ時間です。また、stderr メッセージが時々表示されたり、cat一部のファイルが正しく読み込まれなかったりするため、手動で画面全体をクリアして再描画する必要があることもあります。

現在、このスクリプトを部分的に書き直しているところですが、画面にデータを印刷する点については改善の余地があります。調べてみようかとも思いましたncursesが、少し複雑すぎるようで、おそらく私にとっては維持するのが非常に複雑になってしまうでしょう。

echoまたはprintコマンドをテキスト ファイルにダンプし、それをすべて一度に実行して基本的にテキストの「バックバッファ」を作成し、更新の一貫性と速度を向上させる方法はあるでしょうか?

また、ユーザーのキーストロークを聞いてバックグラウンドでそれに反応できるようにしたいのですが、それは優先事項ではありません。

おそらく、私が知らない、Bash でこの種のことを実行するより良い方法があるのでしょうか?

答え1

を使用するとcolumn -tうまくいくはずです。

答え2

tputカーソルを移動するために使用できます。たとえばtput cup 0 0; echo test、画面の左上に「test」と書き込みます。

あるいは、バッファリングされたアプローチを使用する場合は、行をファイルにダンプし、画面をクリアして、ファイルを cat することもできます。

# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit

# Main lopp
while true
do
  echo "TEST" >$TEMPFILE # Clear file and set first line with >
  date >>$TEMPFILE # Append lines to file with >>

  clear # Clear the screen
  cat $TEMPFILE # Dump the file
  sleep 1 # Just for testing to avoid high CPU
done

trapデバッグ用に一時ファイルを残す場合は、その行をコメントアウトします。

答え3

いくつかの小さなバグと、おそらくパフォーマンスの問題はあるものの、ほぼ目的を達成できたと思います。個人的には、まずバグを解決し、次にパフォーマンスを改善できる部分を探ります。ただし、リフレッシュ レートについては、top や watch などのプログラムでも通常は 2 秒または 1 秒ごとにリフレッシュして実行され、通常はこれで十分です。どのくらいのレートを達成しようとしているのかは述べていません。

同様のStackexchangeの質問これには2つの回答/提案があります。

  1. 何か他のものを学ぶためのプログラムを使用してくださいdialog
  2. 画面上の位置にテキストをクリア、リセット、書き込むための bash 関数の作成を示します。これは、 で使用する可能性のある関数セットに似ていますncursesが、echo (bash 組み込み関数) を使用するという利点があり、/usr/bin/printf出力をフォーマットするために実行する際、オーバーヘッドが発生しません。

問題を順番に解決します。

  1. バックグラウンド コマンドから出力されるエラー。 /dev/null破棄する場合は stderr を にリダイレクトし、後で処理する場合はファイルにリダイレクトします。

  2. 列のバグです。コード、入力データ、必要な出力を示していただければ、提案させていただきます。このバグはバグ #1 の影響である可能性がありますので、まず #1 を解決してから、まだバグが存在する場合はこれに対処してください。

  3. パフォーマンス、(質問を編集)そしてコードを追加して、私たちがあなたのやっていることを把握し、提案できるようにします。

もう一つの方法は、別のスクリプトインタープリタを使うことです。使い慣れているものに応じて、多くの選択肢があります。(awk、python、perl、その他のシェルなど)。ただし、ncursesを使用しない場合は、原則はbash2番目の答えその上。

関連情報