Linuxスクリプトで、ユーザ入力などGUIダイアログを表示したい場合の記述方法のメモ
マニュアル
・gdialogソースコード https://stuff.mit.edu/afs/sipb/project/gtt/build/i386_linux24/gnome-utils/gdialog/
・zenityマニュアル https://help.gnome.org/users/zenity/
・yad manpage http://manpages.ubuntu.com/manpages/cosmic/man1/yad.1.html
情報表示
gdialogの場合は、ダイアログの幅・高さは無視されるので、0, 0 を記述している。
gdialog --title "情報表示ダイアログ" --infobox "表示するメッセージ" 0 0 gdialog --title "情報表示ダイアログ" --msgbox "表示するメッセージ" 0 0
zenityの場合
zenity --info --title="情報表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
yadの場合
yad --image "gtk-dialog-info" --button=gtk-ok:0 \ --title="情報表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
アイコンやボタンのリソース名は、 https://developer.gnome.org/gtk3/stable/gtk3-Stock-Items.html
を参照
警告表示
zenityの場合
zenity --warning --title="警告表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
yadの場合
yad --image "gtk-dialog-warning" --button=gtk-ok:0 \ --title="警告表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
エラー表示
zenityの場合
zenity --error --title="エラー表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
yadの場合
yad --image "gtk-dialog-error" --button=gtk-cancel:0 \ --title="エラー表示ダイアログ" --text="表示するメッセージ" 2>/dev/null
YES / NO 選択ダイアログ
gdialogの場合は、ダイアログの幅・高さは無視されるので、0, 0 を記述している。プログラムの終了コード(EXITCODE)は、YESの場合は 0 、NOの場合は 1 となる。
gdialog --title "YES/NO選択ダイアログ" --yesno "表示するメッセージ" 0 0 EXITCODE=$? echo "EXITCODE=$EXITCODE"
zenityの場合
zenity --question --title="YES/NO選択ダイアログ" --text="表示するメッセージ" 2>/dev/null EXITCODE=$? echo "EXITCODE=$EXITCODE"
yadの場合
yad --image "gtk-dialog-question" --button=gtk-yes:0 --button=gtk-no:1 \ --title="YES/NO選択ダイアログ" --text="表示するメッセージ" 2>/dev/null EXITCODE=$? echo "EXITCODE=$EXITCODE"
テキスト入力ダイアログ
gdialogの場合。プログラム終了コード(EXITCODE)は、OKの場合は 0、キャンセルの場合は 1 が返る。入力された文字列は、標準エラー出力に返されるので、これを標準出力にリダイレクトして変数に代入する。
VALUE=$(gdialog --title "テキスト入力ダイアログ" \ --inputbox "表示するメッセージ" 0 0 "入力 初期値" 2>&1) EXITCODE=$? echo "EXITCODE=$EXITCODE" echo "VALUE=$VALUE"
zenityの場合。widthでダイアログの幅を指定できるが、テキストエリアは大きくならないバグ(特性?)がある。
VALUE=$(zenity --entry --width=400 --title="テキスト入力ダイアログ" \ --text="メッセージ文\n何か入力してください" --entry-text="入力 初期値" 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" echo "VALUE=$VALUE"
yadの場合
VALUE=$(yad --entry --width=400 --title="テキスト入力ダイアログ" \ --text="メッセージ文\n何か入力してください" --entry-text="入力 初期値" 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" echo "VALUE=$VALUE"
カレンダー入力ダイアログ
gdialogにカレンダー入力ダイアログは存在しない。
zenityの場合。選択された年月日を、cutコマンドで切り分けて変数に格納している。
VALUE=$(zenity --calendar --width=400 --title="カレンダー入力ダイアログ" \ --text="日付を選択します" --date-format=%Y-%m-%d 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" YEAR=$(echo $VALUE|cut -c 1-4) MONTH=$(echo $VALUE|cut -c 6-7) DAY=$(echo $VALUE|cut -c 9-10) echo "YEAR=$YEAR" echo "MONTH=$MONTH" echo "DAY=$DAY"
yadの場合
VALUE=$(zenity --calendar --width=400 --title="カレンダー入力ダイアログ" \ --text="日付を選択します" --date-format=%Y-%m-%d 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" YEAR=$(echo $VALUE|cut -c 1-4) MONTH=$(echo $VALUE|cut -c 6-7) DAY=$(echo $VALUE|cut -c 9-10) echo "YEAR=$YEAR" echo "MONTH=$MONTH" echo "DAY=$DAY"
リスト選択ダイアログ
zenityの場合。ダイアログで選択された行は、print-columnで指定されたカラムのデータで返される。
VALUE=$(zenity --list --title="リストから選択させるダイアログ" --text="1つ選択してください" \ --width=400 --height=200 \ --print-column=1 \ --column=ID --column="県" --column="県庁所在地" \ 1 "北海道" "札幌市" \ 2 "青森県" "青森市" \ 3 "岩手県" "盛岡市" \ 4 "秋田県" "秋田市" 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" echo "VALUE=$VALUE"
yadの場合。データの文字の後に、セパレーターが出力されてしまう(バグがある?)ため、separator設定でNULL文字列を指定しておく
VALUE=$(yad --list --title="リストから選択させるダイアログ" --text="1つ選択してください" \ --width=400 --height=200 \ --print-column=1 --separator= \ --column=ID --column="県" --column="県庁所在地" \ 1 "北海道" "札幌市" \ 2 "青森県" "青森市" \ 3 "岩手県" "盛岡市" \ 4 "秋田県" "秋田市" 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE" echo "VALUE=$VALUE"
テキストファイル表示ダイアログ
gdialogの場合。フォントが指定できない制限がある。ダイアログの高さ・幅の設定が可能で、単位は文字単位のようだ。下の例では、横サイズは80文字分と言う意味。
ls -lA ~/ > /tmp/temp01.txt gdialog --title "テキスト表示ダイアログ" --textbox "/tmp/temp01.txt" 50 80 EXITCODE=$? echo "EXITCODE=$EXITCODE"
zenityの場合
ls -lA ~/ > /tmp/temp01.txt zenity --text-info --width=400 --height=200 --title="テキスト表示ダイアログ" \ --filename="/tmp/temp01.txt" --font=Mono 2>/dev/null EXITCODE=$? echo "EXITCODE=$EXITCODE"
yadの場合
ls -lA ~/ > /tmp/temp01.txt yad --text-info --width=400 --height=200 --title="テキスト表示ダイアログ" \ --filename="/tmp/temp01.txt" --fontname=Monospace 2>/dev/null EXITCODE=$? echo "EXITCODE=$EXITCODE"
スケール入力ダイアログ
zenityの場合。
VALUE=$(zenity --scale --title="スケール入力ダイアログ" \ --text="スライダーで値を調整できます\nキーボードでのみstep設定が有効" \ --min-value=-100 --max-value=100 --step=5 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE"
yadの場合
VALUE=$(yad --scale --title="yad スケール入力ダイアログ" \ --text="スライダーで値を調整できます\nキーボードでのみstep設定が有効" \ --min-value=-100 --max-value=100 --value=0 --step=5 2>/dev/null) EXITCODE=$? echo "EXITCODE=$EXITCODE"