====== GUI Scripting from the Shell ====== Give shell scripts dialogs and notifications without a real GUI app. ''notify-send'' and ''zenity'' are usually already installed; ''yad'' (zenity fork) is in the repos and much more capable for forms. ===== Notifications ===== notify-send "Backup done" # transient, doesn't steal focus notify-send -u critical "Fan failure!" # sticky/urgent notify-send -i dialog-information "Hi" "body text" From cron/timer scripts, notifications need the session bus: export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" notify-send "timer fired" ===== zenity: simple dialogs ===== name=$(zenity --entry --text="Name:") # text input zenity --question --text="Continue?" && do_thing # yes/no via exit code zenity --info --text="Done." # OK box zenity --error --text="It broke." file=$(zenity --file-selection) # file picker zenity --calendar # date picker → prints date zenity --password # masked entry zenity --list --column=A a b c # pick from list → prints seq 100 | zenity --progress --auto-close # progress bar from a pipe Every dialog's exit code: 0 = OK/accept, 1 = cancel/closed. Capture output on stdout for input-type dialogs. ===== yad: when zenity isn't enough ===== sudo apt install yad # multi-field form yad --form --title="Add user" \ --field="Name" --field="Email" --field="Admin:CHK" \ "Ada" "ada@x" FALSE # prints pipe-separated values: Ada|ada@x|TRUE| # pick a file, show a text view, menu dialog… yad --file --directory # dir picker cat log.txt | yad --text-info --width=600 --height=400 yad --list --column=Pkg --column=Size pkg1 1M pkg2 2M ===== Choosing ===== * Toast/status updates → ''notify-send'' * One input or a yes/no → ''zenity'' * A real form, multi-select list, or embedded widgets → ''yad'' * Terminal-only dialogs → ''dialog'' / ''whiptail'' (ncurses menus) ===== A small pattern ===== #!/usr/bin/env bash # ask, act, report: all GUI target=$(yad --entry --title="Backup" --text="Backup to which dir?" \ --entry-text="/media/$USER/TRANSFER") || exit 0 if rsync -a ~/Documents/ "$target/Documents/"; then notify-send "Backup" "Done → $target" else zenity --error --text="rsync failed: check disk space" fi Bind scripts like this to a hotkey in LXQt → Shortcut Keys, or drop a ''.desktop'' launcher in ''~/.local/share/applications/'' to get a menu entry. ===== See Also ===== * [[terminal:scripting:start|Scripting Index]] * [[terminal:tools:start|CLI Tools]] * [[terminal:start|Return to terminal]] * [[start|Return to wiki home]]