\r\n\r\n
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 --calendarカレンダー」ダイアログウィンドウが表示されます。標準の日付ピッカーの機能をすべて備えています。月と年を変更し、日をクリックするとその日を選択することができます。デフォルトでは、ウィンドウの表示時に今日の日付がハイライト表示されます。
日付をダブルクリックしても同じことができます。
日付を選択しない場合は、「キャンセル」をクリックするか、キーボードの「Esc」キーを押すか、ダイアログウィンドウを閉じてください。
ユーザーが「OK」をクリックすると、カレンダーが閉じ、選択された日付がターミナルウィンドウに印刷されます。
GTKDialog mapped without transient parent. This is discouraged "という行は無視してもかまいません。
GTKはGIMP Toolkitの略で、GNOMEのインターフェースを開発するために使われたツールキットです。GNUはGNU Image Manipulation Program (GIMP)の作者によってデザインされました。
GTKエンジンは、zenityの作者に対して、GTKコンポーネントを非標準的な方法で使用していることを警告します。
端末に日付を印刷しても、ほとんど意味がない。このカレンダーをスクリプトから呼び出す場合は、選択した日付の値をキャプチャして、スクリプト内で有用な処理を行えるようにする必要がある。また、カレンダーを若干カスタマイズする予定です。
カレンダーでは、以下のオプションを使用します。これらは、2つのダッシュ「-」記号と組み合わせて使用する必要があります。
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()で使用されているものと同じであり、多数のオプションが用意されています。
使用するトークンは
人が選択した日付。
曜日名の後に、日、月、年のヨーロッパ式順序で日付が表示されます。
ファイル選択ダイアログウィンドウは、かなり複雑です。ファイルシステムをブラウズして、1つまたは複数のファイルをハイライトし、OKをクリックしてそれらを選択するか、完全に選択を解除することができます。
カレンダーダイアログウィンドウと同じように簡単に使用することができます。
今回、新たに使用するオプションは
"ファイル選択 "ダイアログウィンドウは、他のファイル選択ウィンドウと同じように機能します。
ユーザーはファイルシステムをブラウズして、好きなファイルを選択することができます。
新しいディレクトリをブラウズして、"ボタン"_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."新たに使用するオプションは
エラーダイアログウィンドウが指定された幅で表示されます。
メッセージダイアログウィンドウを作成するには、次のコマンドを使用します。
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)コマンドは以下のとおりです。
zenityのプログレスダイアログウィンドウを使って、プログレスバーのデモを行うことができます。前のコマンドの出力をzenityにパイプすることに注意してください。
(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close新たに使用するオプションは
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スクリプトの内訳は以下の通りです。
このコマンドは、スクリプトを実行可能にするために使用します。
chmod +x progress.sh以下のコマンドでスクリプトを実行します。
./progress.shスクリプトが実行され、スクリプトの各段階が実行されるたびにテキストメッセージが変化する。プログレスバーは100%単位で動く。
"ズーム "ダイアログウィンドウでは、ユーザーがスライダーを動かして値を選択するため、高すぎる値や低すぎる値を入力することができません。
新たに使用するオプションは
これが、今回使用するコマンドです。
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に転送され、ターミナルウィンドウにプリントされる。
入力ダイアログウィンドウで、テキストを入力することができます。
新たに使用するオプションは
コマンドの全容は以下の通りです。
Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***eテキスト入力フィールドを含む簡単なダイアログウィンドウが表示されます。
誰かがテキストを入力し、編集することができます。
OKをクリックすると、入力した値が変数responseに代入されるので、echoを使ってその値をターミナルウィンドウに出力しています。
これらのテクニックを組み合わせて、関数スクリプトを作ってみましょう。このスクリプトは、ハードウェア情報のスキャンを実行し、その結果をスクロールするテキストウィンドウでユーザーに表示します。ロングスキャンとショートスキャンのどちらかを選択することができます。
今回のスクリプトでは、3種類のダイアログウィンドウを使用しますが、そのうち2種類は初めて使用するものです。
このテキストをエディターに入力し、"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ダイアログウィンドウを作成します。手順は以下の通りです。
ユーザーが「キャンセル」を押した場合は、ListTypeの値を確認する必要はなく、そのまま終了すればよい。OK」を押した場合、「ショート」「ロング」のどちらのラジオボタンを選択したかを知る必要があります。
スクリプトは、ユーザーがどのタイプのスキャンを必要としているかを知っているので、ハードウェア情報のスキャンを実行することができます。
hwinfoのスキャンが完了すると、スクリプトはzenityを呼び出し、--text infoオプションでテキスト情報ダイアログウィンドウを作成します。テキスト情報ダイアログウィンドウには、TempFileファイルの内容が表示されます。
ユーザーがテキストメッセージダイアログウィンドウを閉じると、スクリプトは終了します。
exit 0火をつけて見てみよう。
./hardware-info.shリストボックスが表示され、デフォルトで「Short」オプションが選択されています。
"Long "を選択して "OK "をクリックしましょう。
"Progress "ウィンドウには、ハードウェアスキャンが完了するまで画面に表示されるスライド式インジケータが表示されます。
ハードウェアのスキャンが完了すると、スキャンの詳細を示すテキストメッセージのダイアログウィンドウが表示されます。
"OK "をクリックします。
GUIダイアログウィンドウをいくつか用意すれば、地味なBashスクリプトがプロフェッショナルな雰囲気になることは、熱心なコマンドラインジョッキーでさえ認めざるを得ないでしょう。