GNU/Linux >> Tutoriels Linux >  >> Linux

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

J'ai déjà été frustré par les différences de sortie du which commande sur différentes plates-formes (Linux vs Solaris vx. OS X), avec différents shells pouvant également jouer un rôle. type a été suggéré comme une meilleure alternative, mais à quel point cela serait-il portable ?

Dans le passé, j'ai écrit des fonctions qui analysent la sortie de which et gérer les différents cas d'utilisation que j'ai rencontrés. Ils fonctionnent sur toutes les machines que j'utilise, et conviennent donc à 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 d'un niveau suffisant version pour ne pas avoir de bogue particulier. La plupart du reste du script pourrait être Bourne shell ou Ruby ou n'importe quoi d'autre, mais cette chose particulière doit être faite (autant que je sache) avec zsh ou une version récente de bash.

Puis-je compter sur type être disponible sur toutes les plateformes ? Existe-t-il une autre alternative à which qui peut répondre facilement et de manière cohérente à la question de savoir si un logiciel particulier est installé ?

(Si vous voulez aussi 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 de savoir si une chose particulière est installée sur une machine donnée ?)

Réponse acceptée :

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

which n'est pas standard et n'est pas fiable dans la pratique. type est l'alternative recommandée. whereis souffre des mêmes problèmes que which et est moins courant. whence est 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 celle-ci n'est pas encore complètement implémentée partout. La prise en charge de la version 4 est plus sommaire. Si vous voulez lire ces spécifications, je vous recommande de lire la version 3, qui est beaucoup plus lisible et moins ambiguë que la version 2.

Connexe :Comment copier la disposition des partitions d'un disque entier à l'aide d'outils standard ?

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


Linux
  1. Empêcher un script bash de s'exécuter simultanément

  2. Comment détecter si le shell est contrôlé depuis Ssh ?

  3. Quel système de fichiers à sauvegarder est le meilleur ? ?

  4. Bash + Comment quitter le script secondaire et le script principal à chaque fois ?

  5. Est-il possible de récupérer le contenu d'un script bash en cours d'exécution à partir de la RAM

Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

La "bonne" façon de tester si un service s'exécute dans un script ?

Détecter si la touche est enfoncée à partir du script ?

Variable dans Bash Script qui conserve sa valeur depuis la dernière exécution

Existe-t-il un moyen d'afficher la notification du script bash dans Ubuntu ?

Quelle est la meilleure façon de vérifier si un volume est monté dans un script Bash ?