在开发可在各种 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
您可以使用facter
Puppet 的一部分的工具(但如果您的环境中没有 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