今天我要介绍关于别名的知识。它是典型Unix操作系统管理员使用命令解决的方案之一。这种解决方案仅在某些外壳中受支持——别名提供了将给定的字符串展开为特定命令的简单方法。
别名在 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。 还可以为现有命令设置别名;假设将 -F 选项添加到所有 ls 命令,这样,$ ls 将展开为:$ ls -F。 要设置别名,请使用内置的外壳 alias 语句,并在引号中指定所需的展开形式。例如,要设置前面详细描述的 ll 的展开形式,可使用:$ alias ll='ls -l'。
比如ps 命令,它在基于SVR4 和基于BSD 的Unix操作系统 主机上是不同的。 在 BSD 上指定别名 $ alias ps='ps -o pid,ppid,command' 而在SVR4 主机上指定别名 $ alias ps='ps -opid,ppid,cmd 现在,在这两个系统对 ps 的不同操作方式的限制下,您获得了ps 产生的标准输出。和前面一样,您可以继续添加更多选项;例如,在安装了该别名的任一个平台上请求所有进程,添加 -A 选项就是这样一种情况。
同样以ps为例,您可以创建别名ps-all 来输出所有进程列表,并根据需要为每种平台设置相应的展开形式。
设置这些别名的最佳位置是在登录期间执行的外壳初始化脚本中,例如 .ksh、.profile 或 .bashrc。您可以在这些脚本中执行同样的Unix操作系统检查,以验证要启用哪些别名。如果希望提供适用于所有用户的全局解决方案,则应将别名定义放在公开可用的文件中(例如放在 /etc or /usr/local 中),并设置用户初始化脚本以获得别名定义来源。
别名机制最适合于您希望设置单个命令的命令行选项的情况,虽然也可以使用它们来将给定的命令展开为一组命令或管道。这样削弱了为展开形式中除最后一个命令以外的其他任何命令指定附加参数的能力。
对于处理此类包装,外壳中的内联函数可能更为适合。 大多数外壳都支持函数,这些函数本质上是微型脚本,您可以在其中放置命令和其他外壳脚本元素以执行特定的任务。它们是主外壳定义中的函数,支持许多完整外壳脚本所具有的相同功能,如命令行参数。对于支持别名无法在其中工作的某些命令和组合,对命令行参数的支持非常关键。
例如,killall 命令最基本的功能是终止所有与特定字符串匹配的命令。在Solaris 上,killall 命令存在,但是将其用作关闭过程的一部分以终止所有进程。设想Unix操作系统在 Solaris 主机上意外调用 killall 命令以关闭所有 Apache 进程,没想到却实际上关闭了系统!
如果要在所有主机上使用相同的名称或使用不同的名称实现按名称终止进程的预期结果,并消除不希望的和可能代价高昂的错误,同时扩展本身并不支持该选项的Unix操作系统的功能。可使用kill 命令将 KILL 信号发送到每个匹配进程。在命令行上,您可以通过一系列管道实现等效的功能(使用 KILL 信号)。
提供killall 命令的替代 $ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9 该命令的关键部分是提供给 grep的字符串和ps 输出中包含所需进程 ID 的列。上面的例子对 Solaris 主机和大多数 SVR4 Unix操作系统变种有效。
我们这样就介绍玩了关于别名的知识。
【编辑推荐】