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 TypeSample ImageDescription

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\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.

Share this page:

4 Comment(s)

Add comment

Comments

From: pepa65 at: 2016-12-01 01:53:21

For people on Linux that are more in the gnome realm, there is zenity, or better yet: yadIn my install, pulling in kde-baseapps-bin results in hundreds of megabytes of packages...

From: F-Hauri at: 2016-12-01 11:39:45

There is already a lot of alternatives: dialog, whiptail, gdialog (zenity), kdialog... Have a look there: How do I prompt in a Linux shell script? 5 answer

From: cr at: 2016-12-01 19:02:14

This has to be the most idiotic article I have read all week. Having a dependency to the whole kde base system just to display a few simple dialogs is absolutely horrifyingly stupid if you aren't using KDE already.

From: mb at: 2016-12-03 10:24:57

Install kde-baseapps just to run kdialog? As others note, there are several robust alternatives that will allow one to avoid falling into the pit of noxious practices and thinking such as:

'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?'

Yeah, hard drive space is cheap, but that doesn't mean I want to clutter it up with hundreds of MB of otherwise useless code.

I thought this was a Linux-related article, not one advocating the M$ bloatware approach...