第二章:Improving On User Commands--20.模仿另一个环境: DIR
很多计算机爱好者是从Unix或是Linux操作系统学起的,然而还有很多人是从别的系统学起的,使用不同的命令、不同类型的交互方式。比如说,很有可能你公司的员工更习惯于使用DOS命令,而不是一个shell的解提示器。使用一系列的alias可以稍微减少一点这种差异,比如说将dos命令映射城unix的ls命令:
alias DIR=ls
但如果用户学习过在dos下/w表示宽列表格式的话,这种映射就没什么效果了。因为unix命令会警告没有/w目录。取而代之,像之前写的那些改变输入的封装器一样,接下来的DIR脚本就是用来映射一种类型命令选项到另一种环境中去。
代码:
1 #!/bin/sh 2 3 # DIR.sh -- 假装我们正使用DOS的dir命令 4 # 使用dir命令显示给定文件的内容,该命令可接受标准的dir选项 5 6 function usage 7 { 8 cat << EOF >&2 9 Usage: $(basename $0) [DOS flags] directory or directories 10 where: 11 /D sort by columns 12 /H show help for this shell script 13 /N show long listing format with filenames on right 14 /OD sort by oldest to newest 15 /O-D sort by newest to oldest 16 /P pause after each screenful of information 17 /Q show owner of the file 18 /S recursive listing 19 /W use wide listing format 20 EOF 21 exit 1 22 } 23 24 postcmd="" 25 flags="" 26 27 while [ $# -gt 0 ] 28 do 29 case $1 in 30 /D) flags="$flags -x";; 31 /H) usage;; 32 /[NQW]) flags="$flags -l";; # 正则表达式 33 /OD) flags="$flags -rt";; 34 /O-D) flags="$flags -t";; 35 /P) postcmd="more";; 36 /S) flags="$flags -s";; 37 *) break; # 未知选项:可能是一个文件描述符;所以退出循环 38 esac 39 shift 40 done 41 42 if [ ! -z "$postcmd" ]; then 43 ls $flags "$@" | $postcmd 44 else 45 ls $flags "$@" 46 fi 47 48 exit 0
脚本如何运行:
这个脚本突出了一个真相:shell脚本中的case语句事实上是正则表达式,这个特性非常有用。你可以看到在dos中的/N、/Q、/W选项都被映射到了unix中ls命令的-l选项上。
理论上用户应当被授予unix环境中的语法和选项,但那并不一定是必须的。当然,在调用这个脚本前可以查看脚本中的帮助选项来了解所有的映射选项。
运行脚本:
将脚本命名为DIR.sh,当用户在命令行上键入典型的DOS命令选项时,就会产生一个有意义的输出,而不是以前的那种错误信息:command not found
运行结果:
1 $ DIR /OD /S /Volumes/110GB/ 2 total 60680 3 0 WEBSITES 64 Desktop DB 4 0 Writing 0 Temporary Items 5 0 Microsoft Office X 29648 Norton FS Volume 2 6 0 Documents 29648 Norton FS Volume 7 0 TheVolumeSettingsFolder 0 iTunes Library 8 0 Trash 8 Norton FS Index 9 816 Norton FS Data 0 Desktop Folder 10 496 Desktop DF 0 Desktop Picture Archive
这个目录下的排序方式是从最旧的到最新的,同时显示了文件大小。