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:
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\n"
else
RESULTS += "Personal site backup: Failed\n"
fi
2)
cd $BUSINESSSITE
drush ard --destination=$DESTINATION/mybusinesssite.tar.gz
if [$?=="0"]
then
RESULTS += "Business site backup: Succeeded\n"
else
RESULTS += "Business site backup: Failed\n"
fi
3)
cd $HOBBYSITE
drush ard --destination=$DESTINATION/myhobbysite.tar.gz
if [$?=="0"]
then
RESULTS += "Hobby site backup: Succeeded\n"
else
RESULTS += "Hobby site backup: Failed\n"
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.