Howto:命令/工具能力检查

当开发一个应该运行在各种Unix / Linux衍生产品上的shell脚本时,我有时会遇到这样的问题:与其他系统相比,某些工具必须以不同的方式被调用。 例如,如果参数不同。 我不知道解决这个问题的最好方法是什么。

我是否应该使用uname来检查操作系统名称,并依靠这个以不同的方式执行该工具,或者是否有任何“更好”的方法,某种“能力”检查shell命令和工具?

所讨论的系统例如是Linux,Mac OS X,Solaris和Irix–当涉及到工具和shell命令的能力时,这两者完全不同。

啊,shell脚本的可移植性,好玩!

是的, uname和检查$SHELL是这样做的最简单的方法(也只有我能想到的便携方式)。

查看你的发行版最简单的方法是检查/ etc / issue

 ~$ cat /etc/issue Debian GNU/Linux 6.0 \n \l ~$ cat /etc/issue CentOS release 5.8 (Final) Kernel \r on an \m ~$ cat /etc/issue Ubuntu 12.04.2 LTS \n \l 

您可以使用作为Puppet一部分的facter工具(但是可以独立使用,如果您的环境中没有Puppet)获取有关目标系统的基本信息。

例如:

 $ facter operatingsystem CentOS $ facter kernel kernelversion osfamily kernel => Linux kernelversion => 2.6.32 osfamily => RedHat 

gem install facter应该足够安装在任何带有Ruby的系统上,如果它不在你的系统软件包中的话。

编写便携式代码你会好得多。 使用普通的POSIX几乎任何东西都是可以实现的,然后你就不用担心哪个实用程序需要使用哪个选项。

当有用的东西不可用时,Shell函数总是有用的,例如ls -A:

 ls-A() { ls -f ${1+"$@"} | sort | sed '1,2d' } 

当然,这是非常人为的,但比为每个操作系统维护多套代码要好得多,并且还支持你没有想到的操作系统;

 case $OS in GNU) # some bashisms ;; FreeBSD) # some shisms ;; *) # Oops, don't know what to do! ;; esac