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


9

Antes, fiquei frustrado com as diferenças na saída do whichcomando em diferentes plataformas (Linux vs. Solaris vx. OS X), com diferentes shells possivelmente envolvidos no problema. typefoi sugerido como uma alternativa melhor, mas quão portátil seria?

No passado, escrevi funções que analisam a saída whiche lidam com os diferentes casos de uso nos quais eu me deparei. Eles funcionam em todas as máquinas que eu uso e, portanto, são válidos para meus scripts pessoais, mas isso parece muito pouco confiável para o software que vou postar em algum lugar para que outros possam usar.

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

Posso contar com typea disponibilidade em várias plataformas? Existe alguma outra alternativa para a whichqual possa responder fácil e consistentemente à questão de saber se um determinado software está instalado?

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

Respostas:


10

No século 21, especialmente se você estiver segmentando máquinas com probabilidade de ter bash ou zsh, pode contar com typea disponibilidade. (Ele não existia em unidades extremamente antigas, como nos anos 70 ou no início dos anos 80.) Você não pode contar com a saída que significa qualquer coisa, mas pode contar com o retorno de 0 se houver um comando com esse nome e diferente de zero caso contrário.

whichnão é padrão e não é confiável na prática . typeé a alternativa recomendada. whereissofre dos mesmos problemas whiche é 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 versão 2 da especificação Singe UNIX (exceto itens exóticos como Fortran e SCCS, que são opcionais de qualquer maneira). Você também pode contar com a maioria da versão 3 , mas isso ainda não foi completamente implementado em todos os lugares. O suporte à versão 4 é mais superficial. Se você quiser ler essas especificações, recomendo a leitura da 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, consulte o autoconf e os configurescripts de vários softwares.

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


Isso poderia se beneficiar de uma expansão para comentar as técnicas geralmente recomendadas usando hashe command -v.
Caleb

@ Caleb Para o propósito desta pergunta, não vejo benefício em command -vexcesso type, tudo o que precisamos é de um resultado booleano. A que “técnicas geralmente recomendadas hash” você está se referindo?
Gilles 'SO- stop be evil'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.