如何:命令/工具能力检查

如何:命令/工具能力检查

在开发可在各种 unix/linux 衍生版本上运行的 shell 脚本时,我有时会遇到这样的问题:与其他系统相比,某些工具的调用方式有所不同。例如,如果参数不同。我想知道解决这个问题的最佳方法是什么。

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

所讨论的系统例如 Linux、Mac OS X、Solaris 和 Irix——在工具和 shell 命令的能力方面都非常不同。

答案1

啊,shell 脚本的可移植性,有趣!

是的,uname检查$SHELL是最简单的方法(也是我能想到的唯一可移植的方法)。

答案2

查看你使用的发行版的最简单方法是检查 /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

答案3

您可以使用facterPuppet 的一部分的工具(但如果您的环境中没有 Puppet,则可以独立使用)来获取有关目标系统的基本事实。

例如:

$ facter operatingsystem
CentOS

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

gem install facter如果它不在您的系统包中,那么在任何有 Ruby 的系统上安装它就足够了。

答案4

编写可移植代码会更好。几乎任何事情都可以使用纯 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

相关内容