Adding a Simple GUI to Linux shell scripts with kdialog

Shell scripts are incredibly useful things. They allow you to do something as basic as creating an easy command to replace a more difficult one with lots of flags, to batching up many complex commands to run from a cron job. They’re great because you can quickly fire them off in your favorite terminal, but in some cases they require you to remember specific combinations of flags or options. If you find yourself in this situation, you can add some simple GUI dialogs to help you speed your way through the task at hand.

In order to make use of this tutorial, you’ll need the following:

Access to a Unix-like shell (this is written with bash in mind).

macOS and *nix OSes (like Linux) should come with this or one like it.

On Windows, you could install the CygWin environment, or on recent versions of Windows 10 use the "Windows Subsystem for Linux"

The base libraries for the KDE desktop environment. You don’t need the entire thing, especially if you already have another DE installed.

Installing kdialog should only be necessary if you started with a desktop environment other than KDE, and you have no other KDE applications on your machine. It is a part of the package kde-baseapps-bin on Ubuntu, which means it is installed by default on Kubuntu. On other derivatives, you can install it with the following command at the terminal:

Installing kdialog from the terminal.

sudo apt-get install kde-baseapps-bin

This will likely result in a sizable installation, as other KDE libraries and packages will be installed along with it. But hey, hard drive space is cheap, right?

Since scripts are (in general) supposed to do things automatically, we’ll only need to show this dialog in the following situations:

If we need to capture some sort of input from the user, or;

If we want to show the user some sort of feedback in a noticable way (i.e. not just some text spat out at the command-line).

Let’s take the example of using a command to [backup your Drupal site using drush]. Of course, since you’re a budding Internet entrepreneur, you don’t just have one Drupal site—? you have three. You’d rather not have to run separate commands when you want to back-up all your sites, but at the same time you don’t want to have to remember a long path if you want to take a snapshot of just one. We can use a couple of dialogs to help ourselves by:

Present the user with a list of sites we can back-up, and as her to make a choice, and;

Show the user a message confirming the result, whether it’s a success or failure.

kDialog works by calling it at the command line along with a dialog type, any parameters that type may require, and any other options such as a dialog title.

There are a good variety of dialog types to choose from depending on your needs, as follows:

kDialog Types Dialog Type Sample Image Description Information Message Boxes Displays a box with an "OK" button to close, providing a text message and either a "non-critical" information, warning, or error icon. Passive Pop-up This displays a message that will disappear within a few seconds, i.e. it doesn’t require the user to close or dismiss it. Yes/No Message Box Like the "Information Message Boxes," this displays a dialog with an information/warning/error icon that will also provide the user’s selection of "Yes" or "No." Input Dialog Boxes This provides a single box into which the user can type some text. File Display Boxes This will display the contents of a (plain text) file within a dialog box. Menu and Selection Dialog Boxes This provides a dialog with a list of items, allowing the user to make one or more selections: The Menu and Radiolist Dialogs allow selection of one option.

The Checklist Dialog allows selection of one, multiple, or all options.

The Combobox Dialog allows the selection of one option using a drop-down menu. File Selection Dialog Boxes The user can select part of the filesystem, including: Select existing files, with the ability to filter by name or filetype

Enter a new of a new file to be saved/updated

Directories Progress Dialogs The user can combine kDialog with the dcop command to create a dialog that updates the user on the progress of an operation.

Looking over the above options, two of them jump out as having potential:

The "Checklist Dialog" will allow us to select one, or all, of our sites to back-up.

The "Information Message Box" can be used to display whether each of these has succeeded or failed.

Given these options, we can imagine our script looking something like this:

SITE1 is located HERE (make these full paths, not relative paths) SITE2 is located THERE SITE3 is located IN ANOTHER PLACE display a kDialog with SITE1, SITE2, and SITE3 as options and tell me which one(s) the user picks for each one the user picked: run +drush ard+ on that site, and record whether it was successful or not. display another +kDialog+ with each of those results.

With that in mind, let’s dive right in.

The first thing we should do is assemble the drush command we want to apply to each site when it is selected. Suppose all the sites are on the same web host in different directories, but we want to store the back-ups in a common "backup" directory. We can use the following:

cd SITE drush ard --destination=/home/user/backup/SITENAME.tar.gz

So using your knowledge of setting variables and for loops, we can make this script as follows:

#! /bin/bash // Note: create variables to hold paths to all the sites PERSONALSITE='/home/www/mypersonalsite/' BUSINESSSITE='/home/www/mybusinesssite/' HOBBYSITE='/home/www/myhobbysite/' // Note: create variable to hold path to the destination DESTINATION='/home/user/backup' // Note: display a dialog asking the user to select which sites to back-up CHOICES=$(kdialog --checklist "Select sites to back-up:" 1 "Personal site" off 2 "Business Site" off 3 "Hobby site" off) // Note: log a success/failure message for each of the choices returned from dialog for each in $CHOICES do case { 1) cd $PERSONALSITE drush ard --destination=$DESTINATION/mypersonalsite.tar.gz if [$?=="0"] then RESULTS += "Personal site backup: Succeeded

" else RESULTS += "Personal site backup: Failed

" fi 2) cd $BUSINESSSITE drush ard --destination=$DESTINATION/mybusinesssite.tar.gz if [$?=="0"] then RESULTS += "Business site backup: Succeeded

" else RESULTS += "Business site backup: Failed

" fi 3) cd $HOBBYSITE drush ard --destination=$DESTINATION/myhobbysite.tar.gz if [$?=="0"] then RESULTS += "Hobby site backup: Succeeded

" else RESULTS += "Hobby site backup: Failed

" fi esac // NOTE: display a dialog with the results of all the backup operations. kdialog --msgbox $RESULTS

If we save this and make we can run it as described in the first article in the Bash series we’ll be able to run a single command, get an easy-to-use dialog to choose our site, then see a nice window reporting back how everything went.

While this script can certainly be optimized in a couple of ways, it demonstrates how you can use kdialog to collect some user input and display some results by running a single program within your script.