在开发应该在各种 unix/linux 派生版本上运行的 shell 脚本时,我有时会遇到这样的问题,即与其他系统相比,某些工具必须以不同的方式调用。例如,如果参数不同。我想知道解决这个问题的最佳方法是什么。
我应该使用uname
检查操作系统名称并依靠它以不同的方式执行该工具,还是有任何“更好”的方式,某种“能力”检查 shell 命令和工具?
所讨论的系统包括 Linux、Mac OS X、Solaris 和 Irix——在工具和 shell 命令的能力方面都大不相同。
在开发应该在各种 unix/linux 派生版本上运行的 shell 脚本时,我有时会遇到这样的问题,即与其他系统相比,某些工具必须以不同的方式调用。例如,如果参数不同。我想知道解决这个问题的最佳方法是什么。
我应该使用uname
检查操作系统名称并依靠它以不同的方式执行该工具,还是有任何“更好”的方式,某种“能力”检查 shell 命令和工具?
所讨论的系统包括 Linux、Mac OS X、Solaris 和 Irix——在工具和 shell 命令的能力方面都大不相同。
啊,shell 脚本的可移植性,有趣!
是的,
uname
检查$SHELL
是最简单的方法(也是我能想到的唯一可移植的方法)。查看您使用的发行版的最简单方法是检查 /etc/issue
您可以使用作为
facter
Puppet 一部分的工具(但如果您的环境中没有 Puppet,则可以独立使用)来获取有关目标系统的基本信息。例如:
gem install facter
应该足以将它安装在任何可用 Ruby 的系统上,如果它不在你的系统包中的话。您最好编写可移植代码。几乎任何事情都可以使用普通 POSIX 实现,然后您就无需担心哪些实用程序采用哪些选项。
当有用的东西不可用时,Shell 函数总是有用的,例如 ls -A:
当然,这很做作,但比为每个操作系统维护多套代码要好得多,而且还支持你没有想到的操作系统;