Was ist der beste Weg, um (anhand eines Skripts) zu erkennen, ob Software installiert ist?


9

Ich war zuvor frustriert über Unterschiede in der Ausgabe des whichBefehls auf verschiedenen Plattformen (Linux vs. Solaris vx. OS X), wobei möglicherweise auch verschiedene Shells eine Rolle spielen. typewurde als bessere Alternative vorgeschlagen, aber wie tragbar wäre das?

In der Vergangenheit habe ich Funktionen geschrieben, die die Ausgabe analysieren whichund die verschiedenen Anwendungsfälle behandeln, auf die ich gestoßen bin. Sie funktionieren auf allen Computern, die ich verwende, und sind daher für meine persönlichen Skripte in Ordnung, aber dies scheint für Software, die ich irgendwo veröffentlichen werde, für andere schrecklich unzuverlässig.

Um nur ein mögliches Beispiel zu nennen: Angenommen, ich muss anhand eines Skripts erkennen, ob bash und zsh auf einem Computer verfügbar sind, und dann einen Befehl mit zsh ausführen, falls vorhanden, und mit bash, wenn zsh nicht vorhanden ist und bash ausreicht Version, um keinen bestimmten Fehler zu haben. Der größte Teil des restlichen Skripts könnte Bourne-Shell oder Ruby oder irgendetwas anderes sein, aber diese eine bestimmte Sache muss (AFAIK) entweder mit zsh oder einer neueren Version von bash erledigt werden.

Kann ich mich darauf verlassen type, plattformübergreifend verfügbar zu sein? Gibt es eine andere Alternative, mit whichder die Frage, ob eine bestimmte Software installiert ist, einfach und konsequent beantwortet werden kann?

(Wenn Sie auch Ideen geben möchten, die sich speziell auf das Beispiel beziehen, das ich gegeben habe, ist das großartig, aber ich frage hauptsächlich nach dem allgemeinen Fall: Was ist der zuverlässigste Weg, um herauszufinden, ob eine bestimmte Sache auf einem bestimmten Computer installiert ist ?)

Antworten:


10

Im 21. Jahrhundert können Sie sich darauf verlassen, dass Sie typeverfügbar sind, insbesondere wenn Sie auf Maschinen abzielen, die wahrscheinlich Bash oder Zsh haben . (Es existierte nicht in extrem alten Unices wie in den 1970er oder frühen 1980er Jahren.) Sie können nicht auf die Ausgabe zählen, die etwas bedeutet, aber Sie können auf die Rückgabe von 0 zählen, wenn es einen Befehl mit diesem Namen und gibt sonst ungleich Null.

whichist nicht Standard und in der Praxis unzuverlässig . typeist die empfohlene Alternative. whereisleidet unter den gleichen Problemen wie whichund ist weniger verbreitet. whenceist spezifisch für ksh und zsh.

Wenn dies möglich ist, ist es zuverlässiger, die Existenz eines Befehls zu testen und zu testen, ob sein Verhalten angemessen erscheint. Testen Sie beispielsweise das Vorhandensein einer geeigneten Version von Bash, indem Sie bash -c 'somecommand'z

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

Heute können Sie sich auf fast alles in der Singe UNIX-Spezifikation Version 2 verlassen (mit Ausnahme von exotischen Dingen wie Fortran und SCCS, die ohnehin optional sind). Sie können sich auch auf den größten Teil von Version 3 verlassen , dies ist jedoch noch nicht überall vollständig implementiert. Die Unterstützung für Version 4 ist skizzenhafter. Wenn Sie diese Spezifikationen lesen möchten, empfehle ich, Version 3 zu lesen, die viel besser lesbar und weniger mehrdeutig ist als Version 2.

Beispiele zum Erkennen von Systemspezifitäten finden Sie in der Autoconf und in configureSkripten verschiedener Software.

Weitere Tipps finden Sie unter Ressourcen für die tragbare Shell-Programmierung .


Dies könnte von einer Erweiterung profitieren, um die allgemein empfohlenen Techniken mit hashund zu kommentieren command -v.
Caleb

@Caleb Für die Zwecke dieser Frage sehe ich keinen Vorteil von command -vover type, alles was wir brauchen ist ein boolesches Ergebnis. Auf welche „häufig empfohlenen Techniken hash“ beziehen Sie sich?
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.