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

Shell programs

We will begin by creating a simple shell program that will do the following tasks, in order:

Create a file called dl (short for directory list) using your editor of choice, and enter the following:
   pwd
   ls
   echo This is the end of the shell program.
Now write and quit the file. You have just created a shell program! You can cat the file to display its contents, as the following screen shows:
   $ cat dl
   pwd
   ls
   echo This is the end of the shell program.
   $

Executing a shell program

One way to execute a shell program is to use the sh command. Type:

   sh dl
The dl command is executed by sh, and the pathname of the current directory is printed first, then the list of files in the current directory, and finally, the comment This is the end of the shell program. The sh command provides a good way to test your shell program to make sure it works.

If dl is a useful command, you can use the chmod command to make it an executable file; then you can type dl by itself to execute the command it contains. The following example shows how to use the chmod command to make a file executable and then run the ls -l command to verify the changes you have made in the permissions.

   $ chmod u+x dl
   $  ls -l
   total 2
   -rw-------	1	login	login	3661	Nov  2	10:28 mbox
   -rwx------	1	login	login	  48	Nov 15	10:50 dl
   $

Notice that chmod turns on permission to execute (+x) for the user (u). Now dl is an executable program. Try to execute it. Type:

   dl
You get the same results as before, when you entered sh dl to execute it.

Creating a bin directory for executable files

To make your shell programs accessible from all your directories, you can make a bin directory from your login directory and move the shell files to your bin.

You must also set your shell variable PATH to include your bin directory:

   PATH=$PATH:$HOME/bin
See ``Variables'' and ``Using shell variables'' for more information about PATH.

The following example reminds you which commands are necessary. In this example, dl is in the login directory. Type these command lines:

   cd
   mkdir bin
   mv dl bin/dl
Move to the bin directory and type the ls -l command. Does dl still have execute permission?

Now move to a directory other than the login directory, and type the following command:

   dl
What happened?

It is possible to give the bin directory another name; if you do so, you must change your shell variable PATH again.

Warnings about naming shell programs

You can give your shell program any appropriate filename; however, you should not give your program the same name as a system command. Depending on your path, the system may execute your command instead of the system command. For example, if you had named your dl program mv, each time you tried to move a file, the system might have executed your directory list program instead of mv.

Another problem can occur if you name the dl file ls, and then try to execute the file. You would create an infinite loop, since your program executes the ls command. After some time, the system would give you the following error message:

   Too many processes, cannot fork
What happened? You typed in your new command, ls. The shell read and executed the pwd command. Then it read the ls command in your program and tried to execute your ls command. This formed an infinite loop. For this reason, the SCO OpenServer system limits the number of times an infinite loop can execute. One way to prevent such looping is to give the pathname for the system ls command, /usr/bin/ls, when you write your own shell program.

The following ls shell program would work:

   $ cat ls
   pwd
   /bin/ls
   echo This is the end of the shell program
If you name your command ls, then you can only execute the system ls command by using its full pathname, /usr/bin/ls.
Next topic: Variables
Previous topic: Shell programming

© 2005 The SCO Group, Inc. All rights reserved.
SCO OpenServer Release 6.0.0 -- 02 June 2005