Quelle est la meilleure façon de détecter (à partir d'un script) si un logiciel est installé?

9

J'ai été frustré auparavant par les différences de sortie de la whichcommande sur différentes plates-formes (Linux vs Solaris vx. OS X), avec différents shells pouvant également jouer sur le sujet. typea été suggéré comme une meilleure alternative, mais comment serait-ce portable?

Dans le passé, j'ai écrit des fonctions qui analysent la sortie whichet gèrent les différents cas d'utilisation que j'ai rencontrés. Ils fonctionnent sur toutes les machines que j'utilise, et ne conviennent donc pas à mes scripts personnels, mais cela semble terriblement peu fiable pour les logiciels que je vais publier quelque part pour que d'autres puissent les utiliser.

Pour ne prendre qu'un exemple possible, supposons que je doive détecter à partir d'un script si bash et zsh sont disponibles sur une machine, puis exécuter une commande avec zsh s'il est présent, et avec bash si zsh ne l'est pas et bash est suffisant version pour ne pas avoir de bug particulier. La plupart du reste du script pourrait être le shell Bourne ou Ruby ou toute autre chose, mais cette chose particulière doit être faite (AFAIK) avec zsh ou une version récente de bash.

Puis-je compter sur la typedisponibilité sur toutes les plateformes? Existe-t-il une autre alternative à whichlaquelle peut facilement et systématiquement répondre à la question de savoir si un logiciel particulier est installé?

(Si vous voulez également donner des idées spécifiquement liées à l'exemple que j'ai donné, c'est très bien, mais je pose principalement des questions sur le cas général: quel est le moyen le plus fiable pour savoir si une chose particulière est installée sur une machine donnée ?)

iconoclaste
la source

Réponses:

10

Au 21e siècle, surtout si vous ciblez des machines susceptibles d'avoir bash ou zsh, vous pouvez compter sur typeleur disponibilité. (Il n'existait pas dans des unités extrêmement anciennes, comme dans les années 1970 ou au début des années 1980.) Vous ne pouvez pas compter sur sa sortie pour signifier quoi que ce soit, mais vous pouvez compter sur son retour de 0 s'il existe une commande de ce nom et différent de zéro sinon.

whichn'est pas standard et n'est pas fiable dans la pratique . typeest l'alternative recommandée. whereissouffre des mêmes problèmes whichet est moins courant. whenceest spécifique à ksh et zsh.

Lorsque cela est possible, il serait plus fiable de tester l'existence d'une commande et de vérifier si son comportement semble raisonnable. Par exemple, testez la présence d'une version appropriée de bash en exécutant bash -c 'somecommand', par exemple

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

Aujourd'hui, vous pouvez compter sur presque tout dans la spécification Singe UNIX version 2 (à l'exception des éléments exotiques comme Fortran et SCCS, qui sont de toute façon facultatifs). Vous pouvez également compter sur la plupart de la version 3 , mais cela n'est pas encore complètement implémenté partout. Le support de la version 4 est plus sommaire. Si vous allez lire ces spécifications, je vous recommande de lire la version 3, qui est beaucoup plus lisible et moins ambiguë que la version 2.

Pour des exemples sur la façon de détecter les spécificités du système, regardez autoconf et les configurescripts de divers logiciels.

Voir aussi Ressources pour la programmation de shell portable pour plus de conseils.

Gilles 'SO- arrête d'être méchant'
la source
Cela pourrait bénéficier d'une extension pour commenter les techniques couramment recommandées en utilisant hashet command -v.
Caleb
@Caleb Aux fins de cette question, je ne vois pas d'avantage de command -vplus type, tout ce dont nous avons besoin est un résultat booléen. À quelles «techniques couramment utilisées hash» faites-vous référence?
Gilles 'SO- arrête d'être méchant'