电脑技术学习

标准化您的 UNIX 命令行工具

dn001

  清单 7. 定义一个执行与 killall 相同的信号发送功能的函数

function killall()
{
  ps -ef|grep $1|awk '{ print $2; }'|xargs kill -9
}

  请注意,该函数的 awk 部分中的 $2 不会展开,因为您已经对 awk 脚本定义使用了单引号,这样阻止了展开,并且在此示例中会挑选第二列。

  与别名一样,指定外壳函数的最佳位置是在外壳的初始化脚本中。函数的局限性在于,它们依赖外壳提供支持能力,而这并不总是可能或可用。

  虽然可以随心所欲地使内联外壳函数变得任意长,但在许多情况下,外壳函数并不理想。例如,在模拟更复杂的命令或提供命令包装的超长序列中,您需要分析选项并提供本地化的等效命令,此时内联函数就没有多大用处了。在这种情况下,外壳脚本可能更为适合。

  使用脚本

  构建一致环境的最容易和最兼容的方法,是创建可用作实际命令的包装的外壳脚本,这样考虑了您希望支持的各种选项和设置。

  例如,useradd 和 adduser 命令在设置参数(如用户 ID 或组成员资格)时支持同样的单字母命令行选项,因此 Linux 上的 $ adduser -u 1000 -G sales,marketing mcbrown 等效于 Solaris 上的 $ useradd -u 1000 -G sales,marketing mcbrown。

  然而,Linux 版本还支持扩展命令选项,例如,--uid 和 --groups 等效于上面的命令行选项。这些扩展选项在 Solaris 上不受支持,但是,如果创建一个名为 adduser 的外壳脚本,您就可以模拟 Linux 版本,然后用适当的选项运行实际的 Solaris useradd 命令。

  清单 8 是用作 adduser 或 useradd 命令的包装的示例外壳脚本。

  清单 8. 用作包装的示例外壳脚本

#!/bin/bash
# -*- shell-script -*-
for i in $*
do
 case $i in
   --uid|-u) OPT_UID=$2; shift 2;;
   --groups|-G) OPT_GROUPS=$2; shift 2;;
   --gid|-g) OPT_GROUP=$2; shift 2;;
   --home-dir|-d) OPT_HOMEDIR=$2; shift 2;;
   --shell|-s) OPT_SHELL=$2;shift 2;;
   --non-unique|-o) OPT_NONUNIQUE=1;shift 2;;
   --comment|-c) OPT_COMMENT=$2;shift 2;;
 esac
done
OPTS=""
if [ -n "$OPT_$HOMEDIR" ]
then
  OPTS="$OPTS -d $OPT_HOMEDIR"
fi
if [ -n "$GROUP" ]
then
  OPTS="$OPTS -g $OPT_GROUP"
fi
if [ -n "$OPT_GROUPS" ]
then
  OPTS="$OPTS -G $OPT_GROUPS"
fi
if [ -n "$OPT_SHELL" ]
then
  OPTS="$OPTS -s $OPT_SHELL"
fi
if [ -n "$OPT_UID" ]
then
  OPTS="$OPTS -u $OPT_UID"
fi
if [ -n "$OPT_COMMENT" ]
then
  OPTS="$OPTS -c "$OPT_COMMENT""
fi
if [ -n "$OPT_NOUNIQUE" ]
then
  OPTS="$OPTS -o"
fi
CMD=adduser
UNAME=`uname`
case $UNAME in
  Solaris) CMD=useradd;break;;
esac
$CMD $OPTS $*

标签: