1. 概要

今日、多くのLinuxユーザーは、 GNOME XFCE KDEなどのGUIデスクトップ環境を日常の作業プラットフォームとして選択したいと考えています。 ただし、Linuxでは、多くのジョブがシェルスクリプトで実行されます。 通常、シェルスクリプトを起動すると、Linuxコマンドラインで実行されます。

GUIデスクトップ環境からシェルスクリプトを開始できます。 ただし、スクリプトがその役割を果たしたかどうかを知りたい場合、または実行ステータスを確認したい場合は、スクリプトの開始元のターミナルに切り替えるか、シェルスクリプトのプロセスステータスとログファイルを確認する必要があります。

このチュートリアルでは、シェルスクリプトからGUI通知を送信する方法を見て、スクリプトがどのように実行されているかを簡単に確認できるようにします。

2. シェルスクリプトの例

シェルスクリプトからのGUI通知に対処してデモンストレーションするために、最初に例として簡単なシェルスクリプトを作成します。

tell_me_ip.sh というシェルスクリプトを実行して、パブリックIPアドレスを知りたいとします。

#!/bin/bash
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)"
STATUS=$?

if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]"
else
    MESSAGE="My Public IP: $IP_MSG"
fi
echo $MESSAGE

スクリプトは非常に簡単です。 さっそく歩きましょう。

まず、 curl コマンドを使用してパブリックIPアドレスを取得し、Webサイトhttp://ifconfig.ioを読み取ります。

ここでは、 curl コマンドに、オプション –no-progress-meterを設定してプログレスメーターの出力を抑制するように指示します。

次に、 curl コマンドの終了コードに応じて、IPアドレスまたはエラーメッセージを使用してメッセージを作成します。

最後に、メッセージを印刷します。

スクリプトをすばやくテストしましょう。

$ ./tell_me_ip.sh
My Public IP: 149.224.212.24

エラーケースをシミュレートするために、 tell_me_ip.sh スクリプトのWebサイトURLを存在しないものに変更してみましょう。たとえば、「 http://who.is.it 「:

$ ./tell_me_ip.sh
Error Occurred! [ curl: (6) Could not resolve host: who.is.it ]

良い! シェルスクリプトは機能します。

次に、メッセージを通知としてGUIデスクトップ環境に送信できるかどうかを見てみましょう。

3. notify-sendコマンドの使用

最新のGUIデスクトップ環境のほとんどは、ログイン時に通知サーバーを自動的に起動して、D-Busを介してさまざまなアプリケーションから送信された通知を受信します。

libnotify は、デスクトップ通知仕様の実装です。 広く使用されており、デスクトップに依存しません。

libnotify パッケージには、notify-sendコマンドが付属しています。 これを使用して、シェルスクリプトからGUIデスクトップに通知を簡単に送信できます。

3.1. notify-sendを一言で言えば

notify-sendコマンドを使用する構文は非常に直感的です。

notify-send [OPTIONS] [Message Summary] [Message Body]

[メッセージ本文]はXMLベースのマークアップをサポートしています。 これは、HTMLの小さなサブセットであり、いくつかの追加のタグが付いています。 

一般的に使用されるいくつかの例を見てみましょう。

  • Hello WorldHelloWorldを太字で表示します
  • Hello World は、メッセージを斜体で表示します: Hello World
  • Hello World は、メッセージに下線を付けます: Hello World

notify-send コマンドは、通知の表示方法を制御するオプションをサポートしています。 いくつかの非常に便利なオプションを見てみましょう。

  • -t :通知がデスクトップ画面に表示されるまでの期間をミリ秒単位で定義します
  • -私 :メッセージと一緒に通知に表示するアイコン名を指定します

コマンドラインから「HelloWorld」通知を送信しましょう。

 notify-send -t 3000 -i face-smile "The First Notification" "Hello <b>World</b>"

上記のコマンドを実行すると、楽しい笑顔のアイコンが付いた通知が通知領域に3秒間表示されます。

笑顔以外に、notify-sendコマンドは他の多くのアイコンをサポートしています。

3.2. シェルスクリプトからの通知の送信

次に、シェルスクリプトで notify-send コマンドをアセンブルして、デスクトップ通知を送信します。

#!/bin/bash 
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)" 
STATUS=$? 
ICON="dialog-information"

if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]" 
    ICON="dialog-error"
else
    MESSAGE="My Public IP: $IP_MSG" 
fi
notify-send -t 4000 -i "$ICON" "Public IP" "$MESSAGE"
echo $MESSAGE

元のスクリプトを少し変更しました。

成功とエラーの場合に異なるアイコンを表示したいので、通知アイコン名を格納するために $ICON変数を追加しました。

また、デスクトップに通知を送信するためのnotify-sendコマンドを追加しました。

最後に、シェルスクリプトをテストしてみましょう。

WebサイトのURLを変更して、エラーケースをすばやくテストしましょう。

涼しい! これで、シェルスクリプトはその実行ステータスをGUIデスクトップに送信できます。

4. zenityユーティリティの使用

zenity は、コマンドラインおよびシェルスクリプトでGTKダイアログボックスを表示するためのユーティリティです。 Qt GUI要素を表示する場合は、「Qtのzenityクローン」であるqaramaを使用できます。

このチュートリアルでは、zenityを使用してGTK通知を送信する方法についてのみ説明します。

4.1. 一言で言えばzenity

zenityは、デスクトップ通知やその他のタイプのGTKダイアログを表示できます。たとえば、情報ダイアログ、エラーアラート、カレンダーダイアログ、チェックボックス、ラジオボタンなどです。

zenityコマンドを使用するための構文は次のように単純です。

zenity [Options]

[オプション]は、zenityに実行させたいすべてのことを定義します。 たとえば、表示するGUIダイアログの種類、ダイアログ内の要素の配置方法、またはGUIダイアログとシェルスクリプトの間でデータを送信する方法を指定できます。

結局のところ、フル機能のGTKアプリケーションを設計する必要はありません。 代わりに、私たちの目標は、シェルスクリプトで生成された情報をGUIデスクトップに表示することだけです。

したがって、いくつかのオプションが私たちにとって興味深いものです。

  • –info :情報ダイアログを表示します
  • –error :エラーダイアログを表示します
  • –text = STRING :ダイアログテキストを設定します
  • –通知:デスクトップ通知を表示します

zenity がどのように機能するかを理解するために、zenityコマンドを使用して「HelloWorld」の例をいくつか書いてみましょう。

まず、「HelloWorld」メッセージを使用してデスクトップ通知を作成しましょう。

zenity --notification --window-icon=info --text "Hello World"

上記のコマンドを実行すると、通知が表示されます。

通知を表示するときは、 –textオプションのあるテキストはマークアップをサポートしていないことに注意してください。

また、「HelloWorld」メッセージを含む情報またはエラーダイアログボックスを表示できます。 次のコマンドを使用してエラーダイアログを作成しましょう。

zenity --error --text "Hello World"

メッセージがダイアログに表示されているときに、テキストを選択するか、コピーすることができます。 これは、場合によっては便利です。

ただし、通知ポップアップとは異なり、情報またはエラーダイアログはシェルスクリプトをブロックします。 つまり、「OK」ボタンをクリックすると、シェルスクリプトは実行を継続します。

4.2. シェルスクリプトからのダイアログと通知の表示

それでは、zenitytell_me_ip.shスクリプトに追加しましょう。

パブリックIPを正常に取得すると、情報ダイアログボックスにメッセージとして表示されます。 このようにして、IPアドレスを簡単にコピーできます。 ただし、エラーが発生した場合は、通知で通知する必要があります。

#!/bin/bash 
IP_MSG="$(curl --no-progress-meter http://ifconfig.io 2>&1)"
STATUS=$? 

if [ $STATUS -ne 0 ]; then
    MESSAGE="Error Occurred! [ $IP_MSG ]"
    zenity --notification --window-icon=error --text="$MESSAGE"
else
    MESSAGE="My Public IP: $IP_MSG"
    zenity --info --text="$MESSAGE"
fi
echo $MESSAGE

シェルスクリプトを実行すると、パブリックIPアドレスが情報ダイアログボックスに表示されます。 マウスを使用してIPアドレスを選択できます。

「OK」ボタンをクリックすると、シェルスクリプトの実行が続行され、IPアドレスが出力されます。

スクリプトのURLをhttp://who.is.itに変更し、スクリプトをもう一度起動すると、詳細なエラーメッセージとともにエラー通知が表示されます。

5. 結論

この記事では、シェルスクリプトからGUIデスクトップ環境に情報を送信する方法について説明しました。 この作業を行うために、notify-sendzenityの2つのユーティリティを導入しました。

いくつかの簡単な例で示したように、どちらのユーティリティも非常に簡単に使用できます。 ただし、それらには異なる機能があります。 notify-send はデスクトップ通知のみを送信できますが、zenityはそれ以上のことを実行できます。