Bash でプログレス バーを作成する

Olorunfemi Akinlua 2023年6月20日
  1. pv コマンドを使用して Bash でプログレス バーを作成する
  2. dialog コマンドを使用して Bash でプログレス バーを作成する
  3. ncurses ライブラリを使用して Bash でプログレス バーを作成する
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 Akinlua avatar Olorunfemi Akinlua avatar

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