GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでWhiptailを使用してBashスクリプトでGUIダイアログボックスを作成する方法

少し前に、 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。メッセージボックス

メッセージボックスにはユーザーへのメッセージが表示され、ユーザーが を押すまで待機します または 鍵。 を押すと リターンコード0をスローします を押すと リターンコード255をスローします 。

$ 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"

を押すと 、それはリターンコード0をスローし、ターミナルから実行している場合はコンソール(stderr)に入力したパスワードを返します。

パスワードを変数にキャプチャして、後でスクリプトで使用する必要があります。リダイレクトのセクションで説明したように、結果をリダイレクトする必要があります。

$ 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スクリプトでさまざまなダイアログボックスを作成する方法を簡単に説明しました。すでにホイップテールを使用していて、奴隷の下で何かトリックがある場合は、コメントボックスから共有してください。


Linux
  1. Linux でスレッドを作成する方法 (C サンプル プログラムを使用)

  2. Linux でファイル圧縮を使用して ZFS ファイルシステムを作成する方法

  3. Linuxで特定のサイズのファイルを作成するには?

  1. bash コマンドで CPU スパイクを作成する方法

  2. C++ を使用して Linux でウィンドウを作成するにはどうすればよいですか?

  3. Linux はシェル スクリプトをどのように処理しますか?

  1. LinuxでSSHを使用してパーソナルファイルサーバーを作成する方法

  2. Linuxでpartedコマンドを使用してディスクパーティションを作成する方法

  3. Linuxでtarコマンドを使用してバックアップを作成する方法