Qual é a melhor maneira de detectar (de um script) se o software está instalado?

9

Eu tenho me frustrado antes com diferenças na saída do comando which em diferentes plataformas (Linux vs. Solaris vx. OS X), com diferentes shells possivelmente atuando também no assunto. type foi sugerido como uma alternativa melhor, mas quão portátil seria isso?

No passado, escrevi funções que analisam a saída de which e lidam com os diferentes casos de uso em que me deparei. Eles funcionam em todas as máquinas que eu uso, e por isso estão bem para meus scripts pessoais, mas isso parece terrivelmente não confiável para o software que eu vou postar em algum lugar para os outros usarem.

Para obter apenas um exemplo possível, suponha que eu precise detectar de um script se bash e zsh estão disponíveis em uma máquina e, em seguida, executar um comando com zsh se estiver presente e com bash se zsh não for e bash for de uma versão suficiente para não ter um bug em particular. A maior parte do resto do script pode ser Bourne shell ou Ruby ou qualquer outra coisa, mas essa coisa em particular deve ser feita (AFAIK) com zsh ou uma versão recente do bash.

Posso contar com type disponível em todas as plataformas? Existe alguma outra alternativa para o which que possa responder de forma fácil e consistente à questão de se um determinado software está instalado?

(Se você quiser também dar idéias especificamente relacionadas ao exemplo que dei, isso é ótimo, mas estou principalmente perguntando sobre o caso geral: qual é a maneira mais confiável de descobrir se uma coisa específica está instalada? uma determinada máquina?)

    
por iconoclast 15.07.2011 / 00:46

1 resposta

10

No século 21, especialmente se você estiver segmentando máquinas com probabilidade de ter bash ou zsh, você poderá contar com type disponível. (Não existia em uníssonos muito antigos, como nos anos 70 ou início dos anos 80). Você não pode contar com sua saída significando nada, mas você pode contar com o retorno de 0 se houver um comando com esse nome e diferente de zero.

which não é padrão e não é confiável prática . type é a alternativa recomendada. whereis sofre dos mesmos problemas que which e é menos comum. whence é específico para ksh e zsh.

Quando isso for possível, seria mais confiável testar a existência de um comando e testar se seu comportamento parece razoável. Por exemplo, teste a presença de uma versão adequada do bash executando bash -c 'somecommand' , por exemplo

# Test for the '-v' operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …

Hoje você pode contar com quase tudo na especificação de especificação Singe UNIX 2 (exceto para coisas exóticas como Fortran e SCCS, que são opcionais de qualquer maneira). Você pode contar com a maior parte da versão 3 , mas isso ainda não está completamente implementado em todos os lugares. O suporte Versão 4 é mais simples. Se você for ler essas especificações, recomendo a versão 3, que é muito mais legível e menos ambígua que a versão 2.

Para exemplos de como detectar especificidades do sistema, veja autoconf e em configure scripts de vários softwares.

Veja também Recursos para programação de shell portátil para mais dicas.

    
por 15.07.2011 / 01:43