При разработке сценария оболочки, который должен запускаться на различных производных от unix / linux, у меня иногда возникает проблема, заключающаяся в том, что некоторые инструменты необходимо вызывать по-другому, чем в других системах. Например, если аргументы разные. Интересно, как лучше всего решить эту проблему.
Должен ли я использовать uname
чтобы проверить имя операционной системы и положиться на него, чтобы запустить инструмент по-разному, или есть какие-то «лучшие» способы, какая-то проверка «способности» команд и инструментов оболочки?
Речь идет о системах, например, Linux, Mac OS X, Solaris и Irix - все они совершенно разные, когда дело касается возможностей инструментов и команд оболочки.
Ах, переносимость сценария оболочки, весело!
Да, uname
и проверка $SHELL
- самый простой способ (и единственный переносимый способ, который я могу придумать) сделать это.
Вам гораздо лучше писать переносимый код. Практически все достижимо с использованием простого POSIX, и тогда вам не нужно будет беспокоиться о том, какие утилиты какие опции принимают.
Функции оболочки всегда полезны, когда что-то полезное недоступно, например 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
Вы можете использовать facter
инструмент, который является частью Puppet (но может использоваться независимо, если у вас нет Puppet в вашей среде), чтобы получить основные сведения о целевой системе.
Например:
$ facter operatingsystem
CentOS
$ facter kernel kernelversion osfamily
kernel => Linux
kernelversion => 2.6.32
osfamily => RedHat
gem install facter
должно быть достаточно для его установки в любой системе с доступным Ruby, если он еще не входит в ваши системные пакеты.
Самый простой способ узнать, какой у вас дистрибутив, - это проверить / 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