少し前に、 Zenityについて簡単に説明しました 、コマンドラインおよびシェルスクリプトでグラフィカル(GTK +)ダイアログボックスを作成できるシンプルなプログラム。この記事では、ホイップテールと呼ばれるさらに別のGUIユーティリティについて説明します。 LinuxのBashスクリプトでGUIダイアログボックスを作成するために使用できます。
作成するすべてのスクリプトにフロントエンドのグラフィカルインターフェイスが必要なわけではありません。ただし、コマンドラインの操作に依存するのではなく、グラフィカルインターフェイスを作成した方がよい場合もあります。私の場合、スクリプトに必要な応答の長いリストがある場合は、グラフィカルインターフェイスを使用することを選択します。
Whiptailは、 newtを使用する使いやすいGUIユーティリティです。 プログラミングライブラリ。 Whiptailは、さまざまな目的のためにさまざまなダイアログボックスを提供します。ユースケースに応じて、これらのダイアログボックスを使用して、スクリプトをよりインタラクティブにすることができます。
LinuxにWhiptailをインストールする
Whiptailには多くのディストリビューションがプリインストールされていますが、ディストリビューションにWhiptailがインストールされていない場合は、以下の手順に従ってインストールしてください。
ホイップテールがすでにインストールされているかどうかを確認するには、次のコマンドを実行します。
$ which whiptail
Debian / Ubuntuとその派生ディストリビューションにWhiptailをインストールするには、次のコマンドを実行します。
$ sudo apt install whiptail -y
Fedora / RHEL / CnetOS / AlmaLinux / Rocky Linux:
$ sudo dnf install newt
Arch Linux、EndeavourOS、Manjaro Linux:
$ sudo pacman -S whiptail
アルパインLinux:
$ apk add newt
ヘルプオプション
--help
を使用できます サポートされているダイアログボックスと使用できるその他のオプションのリストを表示するフラグ。合計で、さまざまな機能でサポートされている10個のダイアログボックスがあります。これらすべてについて、次のセクションで説明します。
$ whiptail -help Box options: --msgbox <text> <height> <width> --yesno <text> <height> <width> --infobox <text> <height> <width> --inputbox <text> <height> <width> [init] --passwordbox <text> <height> <width> [init] --textbox <file> <height> <width> --menu <text> <height> <width> <listheight> [tag item] ... --checklist <text> <height> <width> <listheight> [tag item status]... --radiolist <text> <height> <width> <listheight> [tag item status]... --gauge <text> <height> <width> <percent>
1。メッセージボックス
メッセージボックスにはユーザーへのメッセージが表示され、ユーザーが
$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78

上記のコマンドをデコードしてみましょう。
-title | これにより、ウィンドウにタイトルが追加されます |
--msgbox | これにより、指定したメッセージが引用符で囲まれて印刷されます。 |
8 78 | これはウィンドウの高さ(8)と幅(78)を設定します。 |
新しいターミナルを開いて、ホイップテールプロセスを確認できます。スリープ状態になります。意味-
$ ps -ef | grep -i whiptail karthick 20023 9251 0 22:41 pts/0 00:00:00 whiptail --title Welcome Message --msgbox Howdy, Welcome to OSTechnix.. 8 78 karthick 20071 19379 0 22:41 pts/1 00:00:00 grep --color=auto -i whiptail
$ ps -q 20023 -o state --no-headers S
注: 状態( S )->割り込み可能なスリープ(イベントが完了するのを待っています)。
2。情報ボックス
情報はメッセージボックスに似ていますが、違いはメッセージボックスの情報ボックスがユーザー入力を待たないこととは異なります。 –-infobox
を使用する フラグを立てて、情報ボックスに表示される引数として文字列を渡します。
一部のシェルでは、情報ボックスは実行されますが、結果は表示されません。以下のスニペットで行ったように、ターミナルエミュレーションを変更して実行する必要があります。
$ TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78

3。はい/いいえボックス
はい/いいえボックスは、はいのダイアログボックスを表示します またはいいえ <はい>を選択した場合のオプション リターンをスローします コード0 <いいえ>を押すと リターンコード1をスローします 。
--yesno
を使用します 選択を求めるフラグ。はい/いいえボックスとメッセージボックスを組み合わせた次のスニペットを実行します。最初は、[はい/いいえ]オプションが表示され、選択に応じてリターンコードがスローされます。
シェルスクリプトを作成し、以下のスニペットをコピーして実行します。
#!/usr/bin/env bash whiptail --title "CONFIRMATION" --yesno "Should I proceed" 8 78 if [[ $? -eq 0 ]]; then whiptail --title "MESSAGE" --msgbox "Process completed successfully." 8 78 elif [[ $? -eq 1 ]]; then whiptail --title "MESSAGE" --msgbox "Cancelling Process since user pressed <NO>." 8 78 elif [[ $? -eq 255 ]]; then whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78 fi

bashの条件文についてわからない場合は、以下のリンクを使用して、bashの簡単な記事をご覧ください。
- Bashスクリプティング–条件付きステートメント
4。テキストボックス
テキストボックスがファイルを読み取って印刷します。以下のスニペットでは、ostechnix.txt
を読んでいます。 ファイル。フラグ–scrolltextを使用すると、現在のウィンドウに収まらない長いページのテキストがある場合に、マウスホイールを使用して垂直方向にスクロールできます。
$ whiptail --textbox --scrolltext ostechnix.txt 10 80

5。リダイレクト
次のセクションに表示されるダイアログボックスでは、出力を変数に格納し、後で処理に使用する必要があります。ウィジェットからの戻り値は、stdoutではなくstderrに送信されます。したがって、結果が変数に格納されるように、stdoutとstderrを交換する必要があります。
stdoutとstderrを交換するには、次の式を使用する必要があります。
3>&1 1>&2 2>&3
上記の表現を理解してみましょう。 FD1が標準出力であり、FD2が標準エラーです。
- 3>&1 -ファイル記述子3にリダイレクトされるものはすべて、ファイル記述子1にリダイレクトされます。
- 1>&2 -ファイル記述子1(Stdout)に送信されたものはすべて、ファイル記述子2にリダイレクトされます。
- 2>&3 -ファイル記述子2(stderr)に送信されたものはすべて、ファイル記述子3にリダイレクトされます。
このようにして、stdoutとstderrを交換して、変数がダイアログボックスからの戻り値を格納できるようにします。
6。パスワードボックス
[パスワード]ダイアログボックスを使用して、入力時にプレーンテキストとして表示されないパスワードを入力できます。 --passwordbox
を使用します パスワードの入力を求めるプロンプトを表示します。
$ whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"


パスワードを変数にキャプチャして、後でスクリプトで使用する必要があります。リダイレクトのセクションで説明したように、結果をリダイレクトする必要があります。
$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3) $ echo "The password entered by the user is $PASSWORD"

7。入力ボックス
入力ダイアログボックスは、ユーザーに入力を提供するように促します。パスワードダイアログボックスと同様に、端末から実行している場合は、入力した内容が端末に出力されます。リダイレクトを使用して値を変数に格納し、後でプログラムロジックに従って処理するために使用する必要があります。
NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be created" 8 40 3>&1 1>&2 2>&3)


デフォルトの入力テキストを設定することもできます。あなたがしなければならないのは、高さと幅の後にテキストを追加することです。以下は、[init]
の代わりに構文です。 デフォルトのテキストを配置します。
--inputbox <text> <height> <width> [init]
例:
whiptail --title "Create New User" --inputbox "Username to be created" 8 40 noname

次に、入力ボックス、パスワードボックス、はい/いいえボックス、テキストボックスを組み合わせて、簡単なユーザー作成プログラムを作成し、これらのダイアログボックスをどのように結合できるかを確認しましょう。
8。チェックリストダイアログボックス
チェックリストを使用すると、ユーザーが選択できるオプションのリストを作成できます。
--checklist <text> <height> <width> <listheight> [tag item status]...
上記は、チェックリストダイアログボックスを作成するための構文です。 --checklist
を使用する必要があります フラグを立ててから、ダイアログボックスの高さと幅を設定します。
オプション<listheight>
作成するリストの数を指定します。各リストは<status>
でタグ付けされます ONまたはOFFに設定されています。オンは選択されたリストを指し、オフはリストが選択されていないことを示します。
$ whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" ON
リストを選択するには、スペースバーを押し、上下の矢印を使用してリスト間を移動します。完了したら、Enterキーを押します。

出力を配列に保存して、後で使用することができます。タグ(「Chrome、pip3、ksnip、virtualbox」)の名前は、選択に基づいてstderrへの出力として出力されます。
SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" ON 3>&1 1>&2 2>&3))
$ echo ${SELECTED[@]} # Array of values
出力例:
"pip3" "ksnip" "virtualbox"
bash配列についてよくわからない場合は、bash配列に関する詳細な記事があります。以下のリンクをご覧になることをお勧めします。
- Bashスクリプティング-例を使用して説明されたインデックス付き配列
9。ラジオリストダイアログボックス
ラジオリストダイアログボックスはチェックリストダイアログボックスに似ていますが、唯一の違いは、リストから1つのオプションしか選択できないことです。構文的には、ラジオリストとチェックリストはどちらも同じです。
--radiolist <text> <height> <width> <listheight> [tag item status]...
例:
SELECTED=$(whiptail --title "Choose Only One Package" --radiolist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" OFF 3>&1 1>&2 2>&3)

$ echo $SELECTED virtualbox
10。メニューダイアログボックス
メニューダイアログボックスは、ラジオボタンダイアログボックスに似ています。私が感じる唯一の違いは、ラジオボタンのダイアログボックスで<スペースバー>を押してリストから項目を選択し、Enterキーを押す必要があることです。ただし、メニューダイアログボックスでは、Enterキーを押すだけで、タグ名がstderrに返されます。
構文はチェックリストとラジオボタンに似ていますが、唯一の違いは、メニューダイアログボックスで[ステータス]オプションをオン/オフに設定する必要がないことです。
--menu <text> <height> <width> <listheight> [tag item]
例:
TO_RUN=$(whiptail --title "Menu example" --menu "Choose an option" 25 78 5 \ "backup" "Start taking defined backup" \ "restore" "restore from last backup" \ "Schedule" "Display active backup schedules" 3>&1 1>&2 2>&3)

$ echo $TO_RUN backup
11。プログレスバー
プログレスバーを作成するには、次の構文を使用する必要があります。まず、進行状況バーの実行中に印刷されるテキストを渡し、ウィンドウの高さと幅に続いて進行状況のパーセンテージを設定します。
--gauge <text> <height> <width> <percent>
進捗率はロジックによって制御されます。以下のスニペットをご覧ください。 whileループをプログレスバーにリダイレクトし、COUNTER変数を10カウントでインクリメントします。これは、進行状況のパーセンテージとして使用されます。
#!/usr/bin/env bash COUNTER=0 while [[ ${COUNTER} -le 100 ]]; do sleep 1 COUNTER=$(($COUNTER+10)) echo ${COUNTER} done | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}
プログレスバーは10のカウントで増加します。

結論
この記事の終わりに達しました。ここでは、Whiptailを使用してbashスクリプトでさまざまなダイアログボックスを作成する方法を簡単に説明しました。すでにホイップテールを使用していて、奴隷の下で何かトリックがある場合は、コメントボックスから共有してください。