标准化您的 UNIX 命令行工具

本文介绍用于标准化界面以简化在不同 Unix?系统之间移动的方法 。如果您管理多种 UNIX 系统(特别是在异构环境中),则最艰巨的任务可能是在不同环境之间切换并执行不同的任务,同时还必须考虑系统之间的所有差异 。本文并不介绍特定的差异,而是研究能够提供兼容层(或包装)以支持一致环境的方法 。
关于本系列
典型的 UNIX?管理员拥有一套经常用于辅助管理过程的关键实用工具、诀窍和系统 。存在各种用于简化不同过程的关键实用工具、命令行链和脚本 。其中一些工具来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员工作压力的要求 。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具,包括简化异构环境中的管理任务的方法 。
差异和问题
如果您使用多种 UNIX 主机,特别是每种主机都支持不同的 UNIX 风格(Berkeley Software Distribution (BSD)、UNIX System Release 4 (VSVR4) 等)或版本,您也许发现自己要花大量的时间来检查和确定自己所在的主机类型,以便能够适应系统操作方式的变化 。
例如,ps 命令在基于 BSD 和基于 SVR4 的 UNIX 主机上,分别需要不同的命令行选项来获得大致相同的信息(有关更多细节,请参阅 系统管理员工具包: 进程管理技巧) 。平台之间还存在更广泛的差异 。有时,这种差异是命令名称发生了更改;Linux?提供 adduser 命令,而 Solaris 则提供 useradd 命令 。
就标准化而言,有多种方法可供您采用 。
您可以选择对主要平台(例如 Solaris)进行标准化,并在其他平台上提供等效命令的包装以匹配 Solaris 标准 。也可以选择对为所使用的任务提供最佳组合的命令集进行标准化,挑选您喜欢的命令并为特定平台上不存在的命令构建包装 。您可以创建自己的一套执行特定任务的脚本(包括您自己用于 ls、ps 等常用工具的替代脚本),以便它们生成您想要的信息 。这样做有点危险,原因是它意味着您可能从未使用原始命令,从而可能在您的脚本不可用时导致潜在的问题 。如何具体实现各个命令的包装以提供一个兼容或唯一的层,这取决于您是尝试简单地为功能相同的替代命令提供一个公认名称,还是需要构建一个或多个命令的包装以获得等效的结果 。可能的解决方案有三种:
别名——这种解决方案仅在某些外壳中受支持——别名提供了将给定的字符串展开为特定命令的简单方法 。外壳函数——大多数现代外壳都支持这种解决方案——外壳函数使您能够创建更复杂的序列,但是由于它们作为内置函数运行,在差异相当小时可能更为实用 。外壳脚本——当您要构建的包装特别复杂时,更好的解决方案是使用外壳脚本,您可以代替原始命令调用这些脚本 。使用外壳脚本,您可以更创造性地处理替代,甚至为另一个命令提供完全由外壳脚本驱动的替代 。让我们研究一下每种可能的解决方案和一些可通过此方法来进行模拟的示例命令 。
使用别名
别名在 Korn (ksh)、Bourne-Again SHell (bash)、TENEX C shell (tcsh) 和 Z shell (zsh) 外壳中受支持,当您希望设置命令的特定选项,同时仍然支持其他选项时,别名提供了也许是最简单的方法 。顾名思义,您可以将一个命令用作另一个命令的别名,或者为带有附加选项的同一个命令提供别名 。别名从您键入的内容展开为其展开形式 。
例如,一个常用的别名是 ll,它调用等效的 ls -l(ll 通常称为长清单 (long listing)) 。每当用户键入 ll,就会直接将其替换为展开形式,因此:$ ll a* 在执行前展开为:$ ls -l a* 。
命令行选项也仍然有效,换句话说,$ ll -a 展开为:$ ls -l -a 。

推荐阅读