\r\n\r\n

Linuxのシェルスクリプトにguiを追加する方法

bashスクリプトの中で、GUIウィンドウ、スライダー、ラジオボタン、プログレスバーなどを使用することができます。zenity toolboxの使い方を学び、bashスクリプトを一新させることができます。その方法をお教えします...。

Bashスクリプトの中で、GUIウィンドウ、スライダー、ラジオボタン、プログレスバーなどを使用することができます。zenity toolboxの使い方を学び、Bashスクリプトを一新することができます。その方法をお教えします。

Bashスクリプトは、Bashシェルに組み込まれているため、誰でも簡単に利用できる強力なプログラミング言語です。プログラミングを始めるには、とても簡単な言語です。インタプリタ型なので、スクリプトをコンパイルする必要はありません。スクリプトファイルを編集し、実行可能な状態にすると、そのファイルを実行することができるようになります。これにより、コーディング、実行、デバッグのサイクルが非常に効率的になります。

Bashスクリプトに対する不満は主に2つあり、1つ目はスピードです。bashshellはスクリプトのコマンドを解釈するため、コンパイルされたコードのように高速に実行されません。しかし、これはトラクターが車より速くないと文句を言うようなもので、用途が違うのです。

ただし、スピードは2段階。多くの場合、簡単なスクリプトを組み立てて、それを使ってタスクを実行することができるので、コンパイル言語(C言語など)でソリューションを開発するよりもはるかに速いのです。

Bashスクリプトに対する人々の不満の2つ目は、ターミナルウィンドウというユーザーインターフェイスである。もちろん、インターフェイスが重要でない場合もあります。スクリプトを使うのが作者だけであれば、インターフェースはそれほど重要ではないかもしれません。また、バックグラウンドやバッチタイプの処理を行うスクリプトの場合にも重要である。多くの場合、このようなスクリプトは、ユーザーとの対話をあまり必要としません(もしあれば)。

時には、ターミナルウィンドウよりも直感的でモダンなものが必要な場合もあります。グラフィカル・ユーザー・インターフェース(GUI)は、多くの人が知っている。できるだけ摩擦のない体験を人々に提供するためには、スクリプトからGUI要素を作成し、使用する必要があります。

ゼニ応用

zenityでは、Bashスクリプトに多数のGUI要素を取り入れることができます。あなたのスクリプトに現代的な感覚を与え、現代的で親しみやすい外観にするための強力なツールキットです。

zenityは、Ubuntu、Fedora、Manjaroの各ディストリビューションにプリインストールされています。ノームの一部です。KDEをお使いの方はkdialogをお勧めしますが、zenityはどのデスクトップ環境でも動作します。

この記事の例では、コマンドラインからさまざまなダイアログウィンドウを作成する方法、その戻り値やユーザーの選択内容を変数に取り込む方法、そしてスクリプトでダイアログウィンドウを使用する方法について説明します。

最後に、3種類のダイアログウィンドウをすべて使用する小さなアプリケーションを紹介します。

カレンダーダイアログウィンドウ

カレンダーダイアログウィンドウで日付を選択することができます。 zenityでコマンドを作成するには、2つの単語が必要です。

zenity --calendar007Ys3FFgy1gp66kfvoj8j30hy01lt8k

カレンダー」ダイアログウィンドウが表示されます。標準の日付ピッカーの機能をすべて備えています。月と年を変更し、日をクリックするとその日を選択することができます。デフォルトでは、ウィンドウの表示時に今日の日付がハイライト表示されます。

日付をダブルクリックしても同じことができます。

日付を選択しない場合は、「キャンセル」をクリックするか、キーボードの「Esc」キーを押すか、ダイアログウィンドウを閉じてください。

ユーザーが「OK」をクリックすると、カレンダーが閉じ、選択された日付がターミナルウィンドウに印刷されます。

GTKDialog mapped without transient parent. This is discouraged "という行は無視してもかまいません。

GTKはGIMP Toolkitの略で、GNOMEのインターフェースを開発するために使われたツールキットです。GNUはGNU Image Manipulation Program (GIMP)の作者によってデザインされました。

GTKエンジンは、zenityの作者に対して、GTKコンポーネントを非標準的な方法で使用していることを警告します。

日付の値をキャプチャ

端末に日付を印刷しても、ほとんど意味がない。このカレンダーをスクリプトから呼び出す場合は、選択した日付の値をキャプチャして、スクリプト内で有用な処理を行えるようにする必要がある。また、カレンダーを若干カスタマイズする予定です。

カレンダーでは、以下のオプションを使用します。これらは、2つのダッシュ「-」記号と組み合わせて使用する必要があります。

  • -text: カレンダーに表示するテキスト文字列を指定します。デフォルト値の "Select date from below" に置き換わります。
  • -title: カレンダーダイアログウィンドウのタイトルを設定します。
  • -day: カレンダーを開いたときに選択されている日付を設定します。
  • -month:カレンダーを開いたときに選択されている月を設定します。
  • -year:カレンダーを開いたときに選択されている年を設定します。

ChosenDateという変数を使って、カレンダーから返された日付を取得しています。echo$ChosenDateを使って、ターミナルウィンドウに日付を出力しています。

そう、前の例でも同じ結果が得られました。しかし、ここでは選択された日付を変数に保存しています。前の例では、印刷されて忘れ去られていた。

ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 -- month 9 --year 2019); echo $ChosenDate

カレンダーにヒントとウィンドウのタイトルが表示されるようになりました。日付は今日の日付ではなく、任意の開始日に設定されています。

また、選択時に返される日付文字列の書式をカスタマイズすることも可能です。日付形式オプションの後には、形式指定子を付ける必要があります。出力に含めるデータおよびフォーマットを定義するトークンストリングである。これらのトークンは、C関数のstrftime()で使用されているものと同じであり、多数のオプションが用意されています。

使用するトークンは

  • A: 曜日を表すフルネームです。
  • d:数字で示される月の日。
  • m:数字で表される月。
  • %年は2桁(世紀なし)です。
ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 -- month 9 --year 2019); echo $ChosenDate

人が選択した日付。

曜日名の後に、日、月、年のヨーロッパ式順序で日付が表示されます。

ファイル選択ダイアログウィンドウ:ファイルを選択する

ファイル選択ダイアログウィンドウは、かなり複雑です。ファイルシステムをブラウズして、1つまたは複数のファイルをハイライトし、OKをクリックしてそれらを選択するか、完全に選択を解除することができます。

カレンダーダイアログウィンドウと同じように簡単に使用することができます。

今回、新たに使用するオプションは

  • -ファイル選択:ファイル選択ダイアログウィンドウを使用することをzenityに伝えます。
  • -Multiple:複数のファイルを選択できるようにする。
  • -ファイルフィルター:ファイルダイアログウィンドウに表示するファイルの種類を指定します。
zenity --file-selection --tile "How-To Geek" --multiple --file-filter='*.mm *.png *.page *.sh *.txt'

"ファイル選択 "ダイアログウィンドウは、他のファイル選択ウィンドウと同じように機能します。

ユーザーはファイルシステムをブラウズして、好きなファイルを選択することができます。

新しいディレクトリをブラウズして、"ボタン"_blend.pngというファイルを選択しました。"

OKをクリックすると、ファイル選択ダイアログウィンドウが閉じ、ファイル名とパスがターミナルウィンドウに出力されます。

もしファイル名をその後の処理で使用する必要がある場合は、カレンダーから日付を取得するのと同じように、変数に取り込むことができる。

ファイル選択ダイアログウィンドウ:ファイルの保存

オプションを追加すると、「ファイル選択」ダイアログウィンドウを「ファイル保存」ダイアログウィンドウにすることができます。オプションは-saveです。また、-confirm overwriteオプションも使用します。これにより、既存のファイルを上書きするかどうかを確認するプロンプトが表示されます。

Resp***e=$(zenity --file-selection --save --confirm-overwrite); echo $Resp***e

ユーザーがファイル名を入力できるテキストフィールドがあることに注意してください。

ユーザーは、ファイルシステム上の好きな場所を参照し、ファイル名を指定するか、既存のファイルをクリックして上書きすることができます。

上の例では、ユーザーが既存のファイルをハイライトしています。

OKをクリックすると、既存のファイルを置き換えることを確認するダイアログウィンドウが表示されます。注意:警告ダイアログにファイル名が表示されます。このような細部へのこだわりが、zenityのプロフェッショナルな外観を生み出しているのです。

上書き確認オプションを使用しない場合、ファイルは自動的に上書きされます。

ファイル名は、端末のウィンドウに出力される変数responseに格納される。

通知ダイアログウィンドウ

zenityでは、スクリプトの中に簡単に通知ダイアログウィンドウを組み込むことができます。純正のダイアログウィンドウを呼び出して、ユーザーに情報、警告、エラーメッセージ、質問などを提供することができます。

エラーメッセージのダイアログウィンドウを作成するには、次のコマンドを使用します。

zenity --error --width 300 --text "Permission denied. Cannot write to the file."

新たに使用するオプションは

  • -Error: エラーダイアログウィンドウを使用することを zenity に伝えます。
  • -Width: ウィンドウの初期幅を設定します。

エラーダイアログウィンドウが指定された幅で表示されます。

メッセージダイアログウィンドウを作成するには、次のコマンドを使用します。

zenity --info --width 300 --text "Update complete. Click OK to continue."

新しいオプションは --info で、これは zenity に情報ダイアログウィンドウを作成するように指示します。

質問ダイアログウィンドウを作成するには、次のコマンドを使用します。

zenity --question --width 300 --text "Are you happy to proceed?"; echo $?

新しいオプションは --question で、これは zenity に質問ダイアログウィンドウを作成するように指示します。

米ドル?は特殊なパラメータです。直近に実行されたフォアグラウンドパイプラインの戻り値が格納される。一般的には、直近に閉じたプロセスの値である。値0は "OK"、値1以上は "キャンセル "を意味する。

これは、あらゆるzenityのダイアログウィンドウに適用できる汎用的なテクニックです。この値をスクリプトで確認することにより、ダイアログウィンドウから返されたデータを処理すべきか、無視すべきかを判断することができる。

"Yes "をクリックしたので、リターンコードは "OK "を意味するゼロになります

警告ダイアログウィンドウを作成するには、次のコマンドを使用します。

zenity --warning --title "Low Hard Drive Space" --width 300 --text "There may not be enough hard drive space to save the backup."

新しいオプションは --warning で、これは警告ダイアログウィンドウを作成するように zenity に指示します。

警告ダイアログウィンドウが表示されます。これは問題ないので、ボタンは1つだけです。

進捗状況」ダイアログウィンドウ

zenityのプログレスダイアログウィンドウを使用して、スクリプトの完了を示すプログレスバーを表示することができます。

プログレスバーは、スクリプトから渡された値に基づいて高度な処理を行う。原理を説明するために、次のコマンドを使用する。

(for i in $(seq 0 10 100); do echo $i; sleep 1; done)

コマンドは以下のとおりです。

  • seq コマンドは、0 から 100 までのシーケンスを 10 ステップ単位で実行します。
  • 各ステップごとに、変数 i に値が格納され、これが端末ウィンドウに出力される。
  • スリープ1コマンドにより1秒間のサスペンドが発生します。

zenityのプログレスダイアログウィンドウを使って、プログレスバーのデモを行うことができます。前のコマンドの出力をzenityにパイプすることに注意してください。

(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close

新たに使用するオプションは

  • -progress: 進捗状況ダイアログウィンドウを使用することをzenityに指示します。
  • -Autoclose:プログレスバーが100%になったときにダイアログを閉じます。

Progressダイアログウィンドウが表示され、バーが100%まで進み、各ステップの間に1秒の休止時間があります。

zenityへの値のパイプライン化の概念を利用して、プログレスダイアログウィンドウをスクリプトに含めることができます。

このテキストをエディターに入力し、"progress.sh "という名前で保存してください。

!/bin/bash function work-list () { echo "# First work item" echo "25" sleep 1 echo "# Second work item" echo "50" sleep 1 echo "# Third work item" echo "75" sleep 1 echo "# Last work item" echo "100" sleep 1 } work-list | zenity --progress --title "How-To Geek" --auto-close exit 0

スクリプトの内訳は以下の通りです。

  • このスクリプトでは、worklistという関数を定義しています。ここで指令や指示を受けて、実作業を行うのです。各睡眠1コマンドを実際のコマンドに置き換えてください。
  • zenityは "#... "行を受け入れ、プログレスダイアログウィンドウに表示します。これらの行のテキストを変更し、ユーザーに情報を伝えるようにします。
  • 数字を含む改行(例:return "25")もzenityに受け入れられ、プログレスバーの値が設定されます。
  • ワークリスト関数が呼び出され、zenityにパイプされます。

このコマンドは、スクリプトを実行可能にするために使用します。

chmod +x progress.sh

以下のコマンドでスクリプトを実行します。

./progress.sh

スクリプトが実行され、スクリプトの各段階が実行されるたびにテキストメッセージが変化する。プログレスバーは100%単位で動く。

ズームダイアログウィンドウ

"ズーム "ダイアログウィンドウでは、ユーザーがスライダーを動かして値を選択するため、高すぎる値や低すぎる値を入力することができません。

新たに使用するオプションは

  • -scale: スケールダイアログウィンドウを使用することをZenityに指示します。
  • -最小値:スケールの最小値を設定します。
  • -Max:スケールの最大値を設定します。
  • -誰かがマウスを使用している場合、スライダーの動きに影響を与えません。
  • -value: スライダーの初期値および位置を設定します。

これが、今回使用するコマンドです。

Resp***e=$(zenity --scale --title "How-To Geek" --text "Select magnification." --min-value=0 --max-value=30 --step=3 --value15); echo $Resp***e

"スライダー "ダイアログウィンドウが表示され、スライダーは15に設定されています。

ユーザーはスライダーを動かして新しい値を選択することができます。

彼女がOKをクリックすると、値が変数responseに転送され、ターミナルウィンドウにプリントされる。

入力ダイアログウィンドウ

入力ダイアログウィンドウで、テキストを入力することができます。

新たに使用するオプションは

  • -entry: エントリーダイアログウィンドウを使用することをZenityに指示します。
  • -テキストを入力する:このオプションは、テキスト入力フィールドに推奨値を入力する場合に使用することができます。強制的に空欄にするために「"」を使っています。これは厳密には必須ではありませんが、このオプションを記録しておきたいと思います。

コマンドの全容は以下の通りです。

Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***e

テキスト入力フィールドを含む簡単なダイアログウィンドウが表示されます。

誰かがテキストを入力し、編集することができます。

OKをクリックすると、入力した値が変数responseに代入されるので、echoを使ってその値をターミナルウィンドウに出力しています。

まとめ

これらのテクニックを組み合わせて、関数スクリプトを作ってみましょう。このスクリプトは、ハードウェア情報のスキャンを実行し、その結果をスクロールするテキストウィンドウでユーザーに表示します。ロングスキャンとショートスキャンのどちらかを選択することができます。

今回のスクリプトでは、3種類のダイアログウィンドウを使用しますが、そのうち2種類は初めて使用するものです。

  • 1つ目は、人が選択するためのリストダイアログウィンドウです。
  • 2つ目は、進行状況のダイアログウィンドウで、何が起こっているのか、待つべきかをユーザーに知らせます。
  • 3つ目は、ユーザーに結果を表示するためのテキストメッセージウィンドウです。

このテキストをエディターに入力し、"Hardware"-info.shという名前で保存してください。"

#!/bin/bash # Display hardware listing for this computer TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"` if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi # search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile} # Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}" exit 0

実行可能な状態にするには、このコマンドを使用します。

chmod +x hardware-info.sh

このスクリプトは一時ファイルを作成し、そのファイル名はTempFile変数に格納されます。

TempFile=$(mktemp)

このスクリプトでは、-listオプションを使用して、リストダイアログウィンドウと呼ばれるZenityダイアログウィンドウを作成します。手順は以下の通りです。

  • ウィンドウの幅と高さを指定しています。
  • リストダイアログウィンドウはカラムをサポートしています。 --radiolistオプションは最初のカラムをラジオボタンのカラムにします。
  • ウィンドウのタイトルとテキストプロンプトを設定します。
  • 最初のカラムのタイトルを「選択」とし、このカラムの内容はラジオボタンとします。
  • 2列目のタイトルを「選択」に設定し、2列目の内容を提供します。この欄には、"Short "と "Long "の2つのテキストラベルがあります。 TRUEとFALSEの表示は、ダイアログウィンドウの表示時にデフォルトで "Short "オプションが選択されることを意味します。"オプション "です。
  • このダイアログウィンドウの結果をListTypeという変数に格納しています。
ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"`

ユーザーが「キャンセル」を押した場合は、ListTypeの値を確認する必要はなく、そのまま終了すればよい。OK」を押した場合、「ショート」「ロング」のどちらのラジオボタンを選択したかを知る必要があります。

  • 特殊パラメータ$? は、ユーザーが "OK "を押した場合は0に、"キャンセル "を押すかウィンドウを閉じた場合は1になる。
  • 1の場合、スクリプトはエラーメッセージのダイアログウィンドウを表示し、終了します。もし彼が「OK」を押したら、ListType変数の値を引き続きテストすることになる。
  • ListType変数の値が "Short "であれば、スクリプトはFlagという変数に"-Short "と等しい値を設定します。
  • ListType変数が値 "Short "を含んでいない場合、値 "Long "を含む必要がある。このスクリプトでは、Flagという変数に""(空文字列)が設定されます。
  • このスクリプトでは、次のセクションでFlag変数を使用します。
if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi

スクリプトは、ユーザーがどのタイプのスキャンを必要としているかを知っているので、ハードウェア情報のスキャンを実行することができます。

  • スクリプトは、hwinfoコマンドを呼び出し、変数Flagの値を渡している。
  • Flagに"-short "が含まれている場合、hwinfoコマンドはショートスキャンを実行します。Flagの値が""の場合、hwinfoに情報が渡されず、デフォルトのロングスキャンが実行されます。
  • このスクリプトは、hwinfo からの出力を tee にパイプし、tee はその出力を zenity と TempFile に送ります。
  • このスクリプトは、プログレスバーダイアログウィンドウを作成し、ダイアログウィンドウの幅と高さ、およびタイトルとプロンプトテキストを設定するものです。
  • スクリプトは、hwinfoコマンドによって生成される情報量を事前に把握していないため、プログレスバーを正しく100%に設定することができません。-pulsateオプションは、"progress "ダイアログに移動インジケータを表示させるものです。これは、何が起こっているのか、待つべきかをユーザーに知らせるものです。
  • 誰かが "Cancel" をクリックすると、--auto kill オプションがスクリプトを終了させる
  • auto-closeオプションは、監視しているプロセスが終了したときにプログレスダイアログを自動的に閉じるようにします。
# search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile}

hwinfoのスキャンが完了すると、スクリプトはzenityを呼び出し、--text infoオプションでテキスト情報ダイアログウィンドウを作成します。テキスト情報ダイアログウィンドウには、TempFileファイルの内容が表示されます。

  • このスクリプトは、ダイアログウィンドウの幅と高さ、およびタイトルテキストを設定します。
  • flenameオプションは、TempFIle変数に保存されたファイルの内容を読み込むために使用される。
# Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}"

ユーザーがテキストメッセージダイアログウィンドウを閉じると、スクリプトは終了します。

exit 0

火をつけて見てみよう。

./hardware-info.sh

リストボックスが表示され、デフォルトで「Short」オプションが選択されています。

"Long "を選択して "OK "をクリックしましょう。

"Progress "ウィンドウには、ハードウェアスキャンが完了するまで画面に表示されるスライド式インジケータが表示されます。

ハードウェアのスキャンが完了すると、スキャンの詳細を示すテキストメッセージのダイアログウィンドウが表示されます。

"OK "をクリックします。

GUIダイアログウィンドウをいくつか用意すれば、地味なBashスクリプトがプロフェッショナルな雰囲気になることは、熱心なコマンドラインジョッキーでさえ認めざるを得ないでしょう。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ