Team LiB
Previous Section Next Section

#20 Emulating Another Environment: DIR

While many computer aficionados learned how to work with an operating system within a Unix or Linux environment, many others started on other systems with other commands and other styles of interaction. It's quite likely that some users in your organization, for example, are still more comfortable on the MS-DOS command line than they are when faced with a Unix shell prompt. A set of aliases can be installed to ease the transition a little bit, like mapping the DOS command DIR to the Unix command ls:

alias DIR=ls

However, this mapping won't help users if they've already taught themselves that the /W option produces a wide listing format, because the ls Unix command will just complain that directory /W doesn't exist. Instead, in the same spirit as wrappers that change the input, the following DIR script can be written to map one style of command flags to another.

The Code

#!/bin/sh
# DIR - Pretends we're the DIR command in DOS and displays the contents
#   of the specified file, accepting some of the standard DIR flags.

function usage
{
cat << EOF >&2
  Usage: $0 [DOS flags] directory or directories
  Where:
   /D           sort by columns
   /H           show help for this shell script
   /N           show long listing format with filenames on right
   /OD          sort by oldest to newest
   /O-D         sort by newest to oldest
   /P           pause after each screenful of information
   /Q           show owner of the file
   /S           recursive listing
   /W           use wide listing format
EOF
  exit 1
}

postcmd=""
flags=""

while [ $# -gt 0 ]
do
  case $1 in
    /D        ) flags="$flags -x"      ;;
    /H        ) usage ;;
    /[NQW]    ) flags="$flags -l"      ;;
    /OD       ) flags="$flags -rt"     ;;
    /O-D      ) flags="$flags -t"      ;;
    /P        ) postcmd="more"         ;;
    /S        ) flags="$flags -s"      ;;
             *) # unknown flag: probably a dir specifier
                break;  # so let's get outta the while loop
  esac
  shift       # processed flag, let's see if there's another
done

# done processing flags, now the command itself:

if [ ! -z "$postcmd" ] ; then
  ls $flags "$@" | $postcmd
else
  ls $flags "$@"
fi

exit 0

How It Works

This script highlights the fact that shell case statements are actually regular expressions, which is a useful characteristic. You can see that the DOS flags /N, /Q, and /W all map to the same -l Unix flag in the final invocation of the ls command.

Ideally, users would be taught the syntax and options of the Unix environment, but that's not always necessary or desired. Of course, an interim step could be to have this script echo the ls command with all of the mapped flags before actually invoking it. Alternatively, you could have this script map the command and then output some message like Please use ls -l instead.

Running the Code

Name this script DIR, and whenever users type DIR at the command line with typical MS-DOS DIR flags, they'll get meaningful and useful output rather than a command not found error message.

The Results

$ DIR /OD /S /Volumes/110GB/
total 60680
    0 WEBSITES                        64 Desktop DB
    0 Writing                          0 Temporary Items
    0 Microsoft Office X           29648 Norton FS Volume 2
    0 Documents                    29648 Norton FS Volume
    0 TheVolumeSettingsFolder          0 iTunes Library
    0 Trash                            8 Norton FS Index
  816 Norton FS Data                   0 Desktop Folder
  496 Desktop DF                       0 Desktop Picture Archive

This listing of the specified directory is sorted from oldest to newest and has file sizes indicated (directories always have a size of 0).


Team LiB
Previous Section Next Section
This HTML Help has been published using the chm2web software.