More Simple Scripts
Mark Stockton
David Fiedler's "My Favorite One Liners" (SysAdmin,
vol. 1, no. 1) prompts me to describe some additional
ways of maximizing
the compactness of scripts while retaining readability,
saving disk
space, and making the scripts a little more flexible.
What's more,
all of this can be accomplished within the limits of
Mr. Fiedler's
"KISS" (Keep It Simple, Sysadmin) philosophy.
For example, the crtolf one liner is fine for what it
does,
but people who need this utility will also most likely
need a tool
that does the opposite -- an lftocr utility. Instead
of
creating a separate program, which would waste disk
space, how about
the following:
:
#
# crtolf | lftocr
# filter all occurrences of a line feed
# and translate to a carriage return
# or filter all occurrences of a carriage
# return and translate to a line feed
#
if [ "$0" = "crtolf" ]
then
tr "\015" "\012"
exit 0
fi
tr "\012" "\015"
In this example, only one file needs to be created and
then a link can be created to the other file name used
to execute
the program for the desired mode of operation. If the
above is entered
as crtolf, the administrator merely needs to execute
an
ln crtolf lftocr
to create a single script that serves both purposes.
The $0 built-in shell variable will contain the name
of the
program and execute the shell script accordingly.
Similarly, Mr. Fiedler's kind script definitely keeps
things
simple, but it requires that the user be familiar with
the output
of the file command so that the grep utility will catch
what
the user wants. In keeping with my preference not to
oversimplify
at the expense of usability, I would suggest something
like the script
in Listing 1. While this is a little more complex than
a one-liner,
it demonstrates some other handy ways of making a single
script handle
multiple, but related, assignments. As in the previous
example, the
administrator need only enter the file once, then create
the appropriate
links to the arguments passed to the case statement.
The `basename`
$0 handles the rest. The FILE, EOL and DTOEOL
variables are created to save typing; make the program
logic readable;
allow centralized access to redundant statements which
may need to
be debugged or modified; and, in the case of EOL and
DTOEOL,
allow the capability of building new statements which
might be added
later in order to increase functionality.
The above script will function basically the same way
as Mr. Fiedler's.
A
more `scripts /usr/local/bin`
will pass all scripts located in /usr/local/bin
to the more command.
An
execs /usr/lib
will display all binary executable programs in /usr/lib.
So, what if the user wants to recursively search a directory
tree
for a specific type of file? Well, place the script
from Listing 2
in a script named all and you have a nice little "script
system." (The use of script systems creates another
definition
for KISS -- Keep It Simple and Small.)
Now you have a script system which allows the use of
human language
syntax to get the results you're looking for. If you
need a way to
search your system for scripts that you may want to
hack on or explore,
try something like:
all /etc/conf scripts
and you'll get a listing of all scripts under the /etc/conf
directory tree. One word of caution: this script will
eat up processor
resources, so you may want to drop its priority or execute
the program
when system activity is low. Note that in the interest
of brevity,
error checking is kept to a minimum. If the arguments
passed to all
are in reverse order, the program will simply return
the user to a
shell prompt because the find command will fail.
One final observation: even with one-liners, the use
of comments is
important. Careful selection of variable and program
names can minimize
the need, but it is quicker to read a program's comments
than it is
to look up rarely used commands like tr in the manual
pages.
About the Author
Mark Stockton is a UNIX Case Manager in the Compaq
Computer
Coporation Systems Division Phone Support Group and
has been involved
with UNIX support and administration for over six years.
He can be
reached via email as mark@cpqhou.compaq.com or via CompuServe
in the Compaq forum (!go compaq).
|