本站内容有下面分类知识,欢迎您的到来^_^

shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言

设soyo123为首页 收藏本站
当前位置:|主页>shell相关E文资料>

#20 Emulating Another Environment: DIR

百度收藏 QQ搜藏

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).


上一篇:#19 Locating Files by Filename 下一篇:#21 Digging Around in the Man Page Database
power by soyo123 2007-2008