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

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

私は大規模なUSBフラッシュテストのために(内部的に使用される)Bashスクリプトを書いていますf3。複数の列とセルを持つテーブル型のインターフェイスを表示する必要があります。

現在私はprintfwithを使用しています:

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

ログファイルにテキストを書き込む各ドライブに対して別々の機能を実行します。これらのログファイルは解析され、ユーザーに情報を表示します。

ご覧のとおり、一部の行にはあってはならないオフセットがありますが、削除できません。印刷される長い文字列のために発生したようには見えません。私はそれが何であるかわからない。

私が経験しているもう1つの問題はリフレッシュ時間であり、時々stderrメッセージが表示されたり、一部のファイルが正しく読み取られなかったときに全画面を手動で消去して再描画する必要がgrepありますcat

現在、このスクリプトを部分的に再構築しており、画面にデータを印刷することができます。調べてみようかと思いましたncursesが、それは少し複雑すぎてメンテナンスも複雑になることがありました。

echoORprintコマンドをテキストファイルにダンプし、一度にすべて実行してデフォルトでテキスト「バックバッファ」を持たせることで、更新がより一貫して高速化される方法があるかどうか疑問に思います。

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

おそらくBashでこの種の作業を行うより良い方法があるかもしれませんが、わかりません。

答え1

使用法はcolumn -tあなたに合うべきです。

答え2

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

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

# 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秒ごとにリフレッシュされていても、通常は十分です。どんなスピードを達成したいのか言わなかった。

似たようなものがありますスタック交換の質問には2つの答え/提案があります。

  1. プログラムを使用するdialogことは学ぶもう一つのことです。
  2. 画面のどこかにテキストを消去、リセット、書き込むためのbash関数の生成を表示します。で使用できますが、ncursesecho(bash組み込み関数)を使用する利点がある同様の機能セットなので、/usr/bin/printfオーバーヘッドは発生しません。フォーマットされた出力を実行しています。

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

  1. バックグラウンドコマンドからエラーを出力します。/dev/nullただ削除するには、後で処理できるようにstderrをファイルにリダイレクトします。

  2. 列エラー、コード、入力データ、目的の出力を表示すると、推奨事項を提示できます。このバグはバグ#1の影響である可能性が高いため、まず#1を修正してから、この問題がまだ存在する場合は修正してください。

  3. パフォーマンス(質問の編集)を実行してコードを追加すると、あなたが行っていることを確認して提案することができます。

別のアプローチは、別のスクリプトソルバーを使用することです。おなじみのスクリプトソルバーに応じて多くのオプションがあります。 (awk、python、perl、その他のシェル、...)。しかし、ncursesを使用する予定がない場合、原則はbash次のようになります。2番目の答え以上。

関連情報