Howto: verificação de habilidade de comando / ferramenta

1

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.

    
por harald 28.01.2013 / 11:09

4 respostas

1

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.

    
por 28.01.2013 / 11:15
0

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
    
por 10.02.2013 / 09:21
0

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.

    
por 10.02.2013 / 09:51
0

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
    
por 04.03.2013 / 22:38