DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 
Programming with the UNIX system shell

Debugging programs

At times you may need to debug a program to find and correct errors. Two options to the sh command can help you debug a program:


sh -v shell_program_name
Print the shell input lines as they are read by the system.

sh -x shell_program_name
Print commands and their arguments as they are executed.

To try these two options, create a shell program that has an error in it. For example, create a file called bug that contains the following list of commands:

   $ cat bug
   today=`date`
   echo enter person
   read person
   mail $1
   $person
   When you log off come into my office please.
   $today.
   MLH
   $

Notice that today equals the output of the date command, which must be enclosed in grave accents for command substitution to occur.

The mail message sent to Tom at login tommy ($1) should look like the following screen:

   $ mail
   From mlh  Wed Apr 10  11:36  CST  1991
   Tom
   When you log off come into my office please.
   Wed  Apr 10  11:36:32  CST  1991
   MLH
   ?
   .

To execute bug, you have to press the <BREAK> or <DELETE> key to end the program.

To debug this program, try executing bug using sh -v. This will print the lines of the file as they are read by the system, as shown below:

   $ sh -v bug tommy
   today=`date`
   echo enter person
   enter person
   read person
   tom
   mail $1

Notice the output stops on the mail command, since there is a problem with mail. You must use the here document to redirect input into mail.

Before you fix the bug program, try executing it with sh -x, which prints the commands and their arguments as they are read by the system.

   $ sh -x bug tommy
   +date
   today=Wed  Apr 10  11:07:23  CST  1991
   + echo enter person
   enter person
   + read person
   tom
   + mail tommy
   $
Once again, the program stops at the mail command. Notice that the substitutions for the variables have been made and are displayed.

The corrected bug program is as follows:

   $ cat bug
   today=`date`
   echo enter person
   read person
   mail $1 <<!
   $person
   When you log off come into my office please.
   $today
   MLH
   !
   $
The tee command is helpful for debugging pipelines. While simply passing its standard input to its standard output, it also saves a copy of its input into the file whose name is given as an argument.

The general format of the tee command is:

   command_1 | tee saverfile | command_2
saverfile is the file in which the output of command_1 is saved for you to study.

For example, suppose you want to check on the output of the grep command in the following command line:

   who | grep $1 | cut -c1-9
You can use tee to copy the output of grep into a file called check, without disturbing the rest of the pipeline.
   who | grep $1 | tee check | cut -c1-9
The file check contains a copy of the grep output:
   $ who | grep mlhmo | tee check | cut -c1-9
   mlhmo
   $ cat check
   mlhmo   tty61   Apr 10   11:30
   $

Next topic: Modifying your login environment
Previous topic: Examples

© 2004 The SCO Group, Inc. All rights reserved.
UnixWare 7 Release 7.1.4 - 27 April 2004