Bash でプログレス バーを作成する
-
pv
コマンドを使用して Bash でプログレス バーを作成する -
dialog
コマンドを使用して Bash でプログレス バーを作成する -
ncurses
ライブラリを使用して Bash でプログレス バーを作成する
進行状況バーは、実行時間の長いスクリプトやコマンドなどのタスクの進行状況を示す視覚的なインジケーターです。 タスクのステータスについてユーザーにフィードバックを提供するのに役立ちます。また、タスクが完了するまでの残り時間を見積もるのにも役立ちます。
この記事では、Linux および macOS の既定のシェルである Bash のシェル スクリプトにプログレス バーを追加するいくつかの方法について説明します。
pv
コマンドを使用して Bash でプログレス バーを作成する
シェル スクリプトにプログレス バーを追加する最も簡単な方法の 1つは、パイプ ビューアーの略である pv
コマンドを使用することです。 このコマンドを使用すると、パイプを介して渡されるデータの進行状況を監視できます。これを使用して、ターミナルに進行状況バーを表示できます。
たとえば、大きなファイルをある場所から別の場所にコピーするスクリプトに進行状況バーを追加するには、次のコマンドを使用できます。
cat file.txt | pv -s $(stat -c%s file.txt) > /destination/file.txt
このコマンドは cat
を使用して file.txt
ファイルの内容を読み取り、出力を pv
コマンドにパイプします。 pv
コマンドは、-s
オプションを使用して入力データ サイズをバイト単位で指定し、この値に基づいて進行状況を計算します。
pv
コマンドの出力は、宛先ファイルにリダイレクトされます。
スクリプトが実行されると、pv
コマンドはターミナルに進行状況バーを表示し、コピーされたファイルのパーセンテージと、タスクが完了するまでの推定残り時間を示します。 プログレス バーは、データが転送されると動的に更新され、タスクが完了すると消えます。
dialog
コマンドを使用して Bash でプログレス バーを作成する
シェル スクリプトにプログレス バーを追加するもう 1つの方法は、dialog
コマンドを使用することです。これは、ターミナルで使いやすいインターフェイスを作成するためのユーティリティです。 dialog
コマンドは、進行状況バーを含むさまざまなウィジェットを表示でき、スクリプトを介して制御して、タスクの現在の進行状況を表示できます。
dialog
コマンドを使用してプログレス バーをシェル スクリプトに追加するには、--gauge
オプションを使用して新しいプログレス バー ウィジェットを作成します。 --gauge
オプションは、ウィジェットのタイトル、ウィジェットの高さと幅、プログレス バーの初期値など、いくつかの引数を取ります。
以下は、--gauge
オプションを使用して、Copying file
というタイトルで初期値 0 のプログレス バーを作成する方法の例です。
dialog --gauge "Copying file" 10 70 0
このコマンドは、高さ 10 行、幅 70 文字のプログレス バー ウィジェットを作成し、ウィジェットの上部にファイルをコピーしています
というタイトルを表示します。 プログレス バーは最初は空で、値は 0 です。
タスクの進行状況と進行状況バーの値を更新するには、--title
オプションを使用してウィジェットのタイトルを設定し、--gauge-data
オプションを使用して進行状況バーの現在の値を設定します。 たとえば、進行状況バーを更新して 50% 完了したことを示すには、次のコマンドを使用できます。
dialog --title "Copying file" --gauge-data 50
このコマンドは、ウィジェットのタイトルを Copying file
に更新し、進行状況バーの値を 50 に更新します。進行状況バーは新しい値で再描画され、ユーザーはターミナルでタスクの更新された進行状況を確認できます。
dialog
コマンドをシェル スクリプトで使用するには、--and-widget
オプションを使用して、順番に実行する必要があるウィジェット コマンドのリストを指定できます。 これにより、スクリプトで進行状況バーを作成および更新でき、ウィジェットが正しい順序で描画および更新されることが保証されます。
dialog
コマンドを使用してプログレス バーを作成および更新するシェル スクリプトの例を次に示します。
#!/bin/bash
# Create the progress bar widget
dialog --gauge "Copying file" 10 70 0
ncurses
ライブラリを使用して Bash でプログレス バーを作成する
シェル スクリプトにプログレス バーを追加するもう 1つの方法は、ターミナルで使いやすいインターフェイスを作成するためのプログラミング ライブラリである ncurses
ライブラリを使用することです。 ncurses
ライブラリは、インタラクティブなメニュー、フォーム、およびその他のグラフィカル ユーザー インターフェイスを作成するための多くの関数とウィジェットを提供し、シェル スクリプトでカスタム プログレス バーを作成するために使用できます。
ncurses
ライブラリを使用してプログレス バーをシェル スクリプトに追加するには、initscr
関数を使用して画面を初期化し、newwin
関数を使用してプログレス バー用の新しいウィンドウを作成します。 newwin
関数は、ウィンドウの高さと幅、画面上のウィンドウの初期位置など、いくつかの引数を取ります。
以下は、newwin
関数を使用して、画面上の位置 (5,5) に高さ 10 行、幅 70 文字のプログレス バー ウィンドウを作成する方法の例です。
#!/bin/bash
# Initialize the screen
initscr
# Create the progress bar window
win=`newwin 10 70 5 5`
このコードは、画面を初期化し、プログレス バー用の新しいウィンドウを作成します。 win
変数は、スクリプトの進行状況バーにアクセスして更新するために使用できるウィンドウを参照します。
プログレス バーの初期状態を描画するには、box
関数を使用してウィンドウの周りにボックスを描画し、mvwaddstr
関数を使用してプログレス バーのタイトルとボックス内に 0% の初期値を書き込みます。
これらの関数を使用してプログレス バーの初期状態を描画する方法の例を次に示します。
# Draw the box around the window
box $win 0 0
# Write the title and initial value of the progress bar
mvwaddstr $win 1 1 "Copying file"
mvwaddstr $win 1 30 "0%"
タスクの進行状況と進行状況バーの値を更新するには、mvwaddstr
関数を再度使用して、進行状況バーの新しい値をボックス内に書き込むことができます。 たとえば、進行状況バーを更新して 50% 完了したことを示すには、次のコードを使用できます。
# Update the value of the progress bar
mvwaddstr $win 1 30 "50%"
このコードは、進行状況バーの既存の値を 50% の新しい値で上書きします。 進行状況バーは新しい値で再描画され、ユーザーはターミナルでタスクの更新された進行状況を確認できます。
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedIn