标准化您的 UNIX 命令行工具( 二 )


还可以为现有命令设置别名;假设将 -F 选项添加到所有 ls 命令,这样,$ ls 将展开为:$ ls -F 。
要设置别名,请使用内置的外壳 alias 语句,并在引号中指定所需的展开形式 。例如,要设置前面详细描述的 ll 的展开形式,可使用:$ alias ll='ls -l' 。
别名在以下情况下最为有用:您希望使用 base 命令并容易地指定附加选项,同时仍然允许设置特定于平台的选项 。
一个很好的例子就是 ps 命令,它在基于 SVR4 和基于 BSD 的 Unix 主机上是不同的 。在本系列的第一篇文章中,请参阅 系统管理员工具包: 进程管理技巧 ——这篇文章解释了如何使用 ps 的选项来获得相似的清单 。您可以结合别名使用那些选项,而不会影响您指定附加选项的能力 。例如,在 BSD 上,您将如清单 1 所示指定别名 。
清单 1. 在 BSD 上指定别名
$ alias ps='ps -o pid,ppid,command'
而在 SVR4 主机上,您将如清单 2 所示创建别名 。
清单 2. 在 SVR4 上指定别名
$ alias ps='ps -opid,ppid,cmd
现在,在这两个系统对 ps 的不同操作方式的限制下,您获得了 ps 产生的标准输出 。和前面一样,您可以继续添加更多选项;例如,在安装了该别名的任一个平台上请求所有进程,添加 -A 选项就是这样一种情况 。这会在 BSD(在此示例中为 Mac OS X)上产生类似于清单 3 的输出 。
清单 3. 在 BSD 上使用 -A 选项
$ ps -A
 PID PPID COMMAND
1 0 /sbin/launchd
23 1 /sbin/dynamic_pager -F /private/var/vm/swapfile
27 1 kextd
32 1 /usr/sbin/KernelEventAgent
33 1 /usr/sbin/mDNSResponder -launchdaemon
34 1 /usr/sbin/netinfod -s local
35 1 /usr/sbin/syslogd
36 1 /usr/sbin/cron
37 1 /usr/sbin/configd
38 1 /usr/sbin/coreaudiod
39 1 /usr/sbin/diskarbitrationd
...
SVR4 系统(Gentoo Linux 主机)会显示同样的列,如清单 4 所示 。
清单 4. 在 SVR4 上使用 -A 选项
$ ps -A
 PID PPID CMD
1 0 init [3]
2 1 [migration/0]
3 1 [ksoftirqd/0]
4 1 [watchdog/0]
5 1 [migration/1]
6 1 [ksoftirqd/1]
7 1 [watchdog/1]
8 1 [events/0]
9 1 [events/1]
10 1 [khelper]
11 1 [kthread]
1411 [kblockd/0]
1511 [kblockd/1]
1611 [kacpid]
...
另一个选项或多或少地镜像了本文其他地方给出的脚本和函数解决方案 。该选项是为给定命令的特定输出创建别名,这些别名采用同一方法来提供相同的格式化输出 。同样以 ps 为例,您可以创建别名 ps-all 来输出所有进程列表,并根据需要为每种平台设置相应的展开形式 。
设置这些别名的最佳位置是在登录期间执行的外壳初始化脚本中,例如 .ksh、.profile 或 .bashrc 。您可以在这些脚本中执行同样的系统检查,以验证要启用哪些别名 。如果希望提供适用于所有用户的全局解决方案,则应将别名定义放在公开可用的文件中(例如放在 /etc or /usr/local 中),并设置用户初始化脚本以获得别名定义来源 。
别名机制最适合于您希望设置单个命令的命令行选项的情况,虽然也可以使用它们来将给定的命令展开为一组命令或管道 。这样削弱了为展开形式中除最后一个命令以外的其他任何命令指定附加参数的能力 。对于处理此类包装,外壳中的内联函数可能更为适合 。
使用内联外壳函数
大多数外壳都支持函数,这些函数本质上是微型脚本,您可以在其中放置命令和其他外壳脚本元素以执行特定的任务 。由于它们是主外壳定义中的函数,因此使用起来方便快捷,同时仍然支持许多完整外壳脚本所具有的相同功能,如命令行参数 。
对于支持别名无法在其中工作的某些命令和组合,对命令行参数的支持非常关键 。例如,killall 命令最基本的功能是终止所有与特定字符串匹配的命令 。该命令并非在所有平台上都可用,但是一旦您了解了它,就会希望在其他环境中使用它 。

推荐阅读