Ahh, portabilidade do shell script, divertido!
Sim, uname
e verificação de $SHELL
são a maneira mais fácil (e apenas a maneira portátil em que consigo pensar) para fazer isso.
Ao desenvolver um script de shell que deve ser executado em várias derivadas unix / linux, às vezes tenho o problema de que algumas ferramentas precisam ser chamadas de maneira diferente em comparação com outros sistemas. Por exemplo, se os argumentos forem diferentes. Eu me pergunto qual é a melhor maneira de resolver isso.
Devo usar uname
para verificar o nome do sistema operacional e confiar nisto para executar a ferramenta de maneiras diferentes ou existem maneiras "melhores", algum tipo de verificação de "habilidade" para comandos e ferramentas de shell? / p>
Os sistemas em questão são, por exemplo, Linux, Mac OS X, Solaris e Irix - todos bastante diferentes quando se trata de habilidades de ferramentas e comandos shell.
A maneira mais fácil de ver em qual distro você está é verificar o / 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
Você pode usar a ferramenta facter
, que faz parte do Puppet (mas pode ser usada independentemente, se você não tiver o Puppet no seu ambiente) para obter informações básicas sobre o sistema de destino.
Por exemplo:
$ facter operatingsystem
CentOS
$ facter kernel kernelversion osfamily
kernel => Linux
kernelversion => 2.6.32
osfamily => RedHat
gem install facter
deve ser suficiente para instalá-lo em qualquer sistema com Ruby disponível, se ele não estiver nos pacotes do seu sistema.
Você está muito melhor escrevendo código portátil. Quase tudo é possível usando POSIX simples, e então você não precisa se preocupar com quais utilitários tomarão quais opções.
As funções do shell sempre são úteis quando algo útil não está disponível, por exemplo, ls -A:
ls-A()
{
ls -f ${1+"$@"} | sort | sed '1,2d'
}
Claro, isso é muito artificial, mas muito melhor do que manter vários conjuntos de códigos para cada sistema operacional e também suporta sistemas operacionais nos quais você não tinha pensado;
case $OS in
GNU)
# some bashisms
;;
FreeBSD)
# some shisms
;;
*)
# Oops, don't know what to do!
;;
esac
Tags bash linux shell unix shell-scripting