(X)dialog: Talking shells
ArticleCategory: [Choose a category, translators: do not
translate this, see list below for available categories]
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
original in en Katja and Guido Socher
AboutTheAuthor:[A small biography about the author]
Katja is the German editor of LinuxFocus. She likes Tux,
film & photography and the sea. Her homepage can be found
Guido is a long time Linux fan and he likes Linux because it
is designed by honest and open people. This is one of the
reasons why we call it open source. His homepage is at linuxfocus.org/~guido.
Abstract:[Here you write a little summary]
Xdialog and dialog are two classic utilities to enhance your shell
scripts with a graphical user interface.
You will need some shell programming knowledge to understand
the article. To learn about the basics of shell programming you can read
our article on
ArticleIllustration:[One image that will end up at the top
of the article]
ArticleBody:[The main part of the article]
The UNIX shell is a very productive environment in itself and
works well without a graphical user interface.
In a few cases however it makes sense to have a graphical dialog with the
user. An example would be the installation dialog of a program.
You have a number of options for the features to install and
you can select the target directory ....
With dialog and Xdialog you can design a graphical application by writing
just a short shell script. Dialog is a purely terminal based program and
Xdialog is a X11 program.
Here is an example:
You can type (or copy/paste) the following lines into a shell window
The box that appears will look like this:
Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\
case $? in
echo "Result: Yes chosen.";;
echo "Result: No chosen.";;
echo "ESC pressed.";;
If you use dialog instead of Xdialog (remove the X on the
second line in the script shown above) then you get a curses
based application that runs within the xterm and does not open
a separate window. In some cases this is more appropriate for a
shell script as it runs just within the terminal window.
Especially if you want to run it remotely with a
number of different hosts between your computer and the remote
host where direct IP routing is not available. In this case dialog will work
but you will not be able to start an X11 application like Xdialog.
The above was a pretty useless example of dialog/Xdialog
but it shows how easy it is to program a simple graphical dialog.
more interesting dialog boxes. Boxes like calendar, menus,
filemanager, progess bar, text input, message box, password dialog, ...
You can run
to get a list of the available dialog boxes. Xdialog has a few
more boxes than dialog.
How it works
The dialog boxes are configured on the command line.
dialog --yesno "text string" <height>
After typing dialog or Xdialog you have to give the name of the box
you want followed by its specific parameters.
box takes 3 parameters.
The <height> and <width> can be set to zero in
which case the geometry of the box will be automatically adjusted
to the size of the text. The result is returned as exit status
the script in the "$?" variable. If there is more to return
like e.g. the names of selected options then this is returned on
standard error. Standard error is normally just printed to the screen
but can be redirected with "2>".
A very simple but efficient solution.
Now a real world application where Xdialog/dialog really provides an
advantage over conventional shell script programs: A menu where
you can select different Internet Service Providers and dial out
to connect to the Internet. This script requires the
ppp-on/ppp-off scripts from the March 2001 article Using different
ISPs for your Internet access. The script is called pppdialout and
displays a different menu dependent on whether you are online or
# name of your default isp:
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in /etc/ppp/peers
pppdialout executes the ppp-on/ppp-off scripts as described
pppdialout, copyright gpl, http://linuxfocus.org/English/November2002
# parse command line:
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
trap "rm -f $tempfile" 1 2 5 15
# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
# we are already online
$DIALOG --title "go offline" --yesno "Click YES to \
terminate the ppp connection" 0 0
if [ "$rval" = "0" ]; then
echo "running /etc/ppp/scripts/ppp-off ..."
# no ppp connection found, go online
# get the names of all available ISP by listing /etc/ppp/peers
for f in `ls /etc/ppp/peers`; do
if [ -f "/etc/ppp/peers/$f" ]; then
isplist="$isplist $f =="
[ -z "$isplist" ]&&error "No isp def found in /etc/ppp/peers"
$DIALOG --default-item "$defaultisp" --title "pppdialout" \
--menu "Please select one of\
the following ISPs for dialout" 0 0 0 $isplist 2> $tempfile
rval="$?" # return status, isp name will be in $tempfile
if [ "$rval" = "0" ]; then
echo "running /etc/ppp/scripts/ppp-on $isp..."
rm -f $tempfile
# end of pppdialout
How the script works:
At the beginning we define some functions, error and help, next
we check for commandline arguments then a name for a temporary
file is defined (/tmp/pppdialout.$$). $$ is the name of the
current process and is a unique number for every computer. The trap
statement is executed if the program terminates abnormally (like the user presses crtl-C)
and deletes the tempfile in our case.
After that we check if we are already
online or not (command: /sbin/ifconfig | grep '^ppp'). If we
are already online then we open a yesno-box, the one you have
already seen above, and ask the user if she wants to go offline.
If we are not online then a menu box is opened. We get all the
available ISPs by listing the files in /etc/ppp/peers (ls
/etc/ppp/peers). The syntax of the menu box is:
dialog --menu "text" <height>
<width> <menu height> <tag1>
The <height>, <width> and <menu height> are
again set to zero (automatic size, see above) and then the program expects
pairs of strings (<tag1> <description>). We don't
really have a description so we set it to something meaningless
(== in this case). The data in the variable isplist will look like this:
isp1 == isp2 == isp3 ==
The result of the user's choice is printed by (X)dialog on standard
error. The shell command "2> $tmpfile" writes it to our
tmpfile. The menu box offers also the possibility to press
cancel. Therefore we have to check $? (exit status) to find out
which button is pressed.
Ok, enough theory. Here is how it looks like
... as nice GTK GUI with Xdialog:
... with the curses based dialog in the terminal:
We have one more application for you. It is called mktgz and
uses the checklist box of Xdialog. The plain terminal based
dialog does not have a checklist therefore it works only with
Xdialog. You can use mktgz to build tar.gz packages.
mktgz yourpackage .
This displays all files of the current working directory
(".") and you can select which ones to include into the
yourpackage.tar.gz package. You
can download it here (mktgz.txt)
We will not go through the code line
by line as you should already know enough to read the script.
Xdialog and dialog come with a directoy called "samples" where
you can find more examples (Redhat 7.3 stores them under /usr/share/doc/Xdialog-2.0.5/samples).
Be careful however as some of them
really do something and are not pure demo applications.
Xdialog and dialog offer a number of different dialog boxes. Not
all of them are always appropriate for all types of shell
scripts. The shell itself is also a very "powerful"
environment. Completing a path with the tab-key can be a lot
faster than searching the different directories in a GUI
and clicking on them.
possibility to pipeline and combine commands makes it a very
powerful tool. Something like:
grep -i "somestring" file.txt | sort | uniq | wc -l
(for those not so experienced with UNIX shells: This
counts all distinct lines in file.txt which contain the string
Such pipeline constructs are possible because all the commands
are controlled by command line arguments. In other words: they
don't stop and ask the user how she wants to continue.
There are however applications where
graphical dialogs are really useful. Xdialog and dialog are
very easy to use but of course not as powerful as a real
graphical application. They fill the gap between a pure ASCII
shell script and a full graphical application.
Where to get Xdialog and dialog?
The CDs of your linux distribution are the first place to look
for dialog and Xdialog. It could be that they are already
installed on your computer (ask your computer: e.g. rpm -qil Xdialog, dpkg -L Xdialog).
The homepage of Xdialog is:
and dialog is at
You can also download dialog/Xdialog from there.