Назад | Перейти на главную страницу

Как: проверка способности команды / инструмента

При разработке сценария оболочки, который должен запускаться на различных производных от 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