GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Der beste Weg, um (aus einem Skript) zu erkennen, ob Software installiert ist?

Ich war schon früher frustriert über Unterschiede in der Ausgabe von which Befehl über verschiedene Plattformen (Linux vs. Solaris vx. OS X), wobei möglicherweise auch verschiedene Shells in die Angelegenheit einfließen. type wurde als bessere Alternative vorgeschlagen, aber wie portabel wäre das?

In der Vergangenheit habe ich Funktionen geschrieben, die die Ausgabe von which parsen und behandle die verschiedenen Anwendungsfälle, auf die ich gestoßen bin. Sie funktionieren auf allen von mir verwendeten Computern und sind daher für meine persönlichen Skripte in Ordnung, aber dies scheint für Software, die ich irgendwo zur Verwendung durch andere posten werde, schrecklich unzuverlässig zu sein.

Um nur ein mögliches Beispiel zu nennen, nehmen wir an, ich muss anhand eines Skripts erkennen, ob bash und zsh auf einem Computer verfügbar sind, und dann einen Befehl mit zsh ausführen, wenn es vorhanden ist, und mit bash, wenn zsh nicht vorhanden ist und bash ausreichend ist Version, 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 gemacht werden.

Kann ich mich auf type verlassen plattformübergreifend verfügbar sein? Gibt es eine andere Alternative zu which die die Frage, ob eine bestimmte Software installiert ist, einfach und konsistent beantworten kann?

(Wenn Sie auch Ideen geben möchten, die sich speziell auf das von mir gegebene Beispiel beziehen, ist das großartig, aber ich frage hauptsächlich nur nach dem allgemeinen Fall:Was ist der zuverlässigste Weg, um herauszufinden, ob ein bestimmtes Ding auf einem bestimmten Computer installiert ist? ?)

Akzeptierte Antwort:

Im 21. Jahrhundert können Sie sich auf type verlassen, insbesondere wenn Sie auf Computer abzielen, die wahrscheinlich bash oder zsh haben verfügbar sein. (Es existierte nicht in extrem alten Unices wie in den 1970er oder frühen 1980er Jahren.) Sie können sich nicht darauf verlassen, dass seine Ausgabe irgendetwas bedeutet, aber Sie können sich darauf verlassen, dass es 0 zurückgibt, wenn es einen Befehl mit diesem Namen gibt und andernfalls ungleich Null.

which ist kein Standard und in der Praxis unzuverlässig. type ist die empfohlene Alternative. whereis leidet unter denselben Problemen wie which und ist seltener. whence ist spezifisch für ksh und zsh.

Wenn das möglich ist, wäre es zuverlässiger, die Existenz eines Befehls zu testen und zu testen, ob sein Verhalten vernünftig aussieht. Testen Sie beispielsweise das Vorhandensein einer geeigneten Version von bash, indem Sie bash -c 'somecommand' ausführen , z. B.

# 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 Exoten wie Fortran und SCCS, die sowieso optional sind). Auf den Großteil der Version 3 kann man sich auch verlassen, diese ist aber noch nicht überall vollständig implementiert. Die Unterstützung von Version 4 ist lückenhafter. Wenn Sie diese Spezifikationen lesen, empfehle ich Version 3, die viel besser lesbar und weniger zweideutig ist als Version 2.

Verwandte:Wie kopiert man das Partitionslayout einer ganzen Festplatte mit Standardwerkzeugen?

Beispiele dafür, wie Systemspezifitäten erkannt werden, finden Sie unter autoconf und unter configure Skripte verschiedener Software.


Linux
  1. Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner?

  2. Welches zu sichernde Dateisystem ist das beste?

  3. Bash + So beenden Sie beide Male das sekundäre Skript und das Hauptskript

  4. Beste Möglichkeit, alle Slurm-Jobs von der Shell-Befehlsausgabe abzubrechen?

  5. Installieren von Programmen aus dem Bash-Skript?

Der „richtige“ Weg, um zu testen, ob ein Dienst in einem Skript ausgeführt wird?

Erkennen, ob die Taste aus dem Skript gedrückt wird?

In Bash-Skript zur/von der Zwischenablage leiten

Jede Möglichkeit, das Bash-Skript zu beenden, aber das Terminal nicht zu verlassen

Gibt es eine Möglichkeit, Benachrichtigungen vom Bash-Skript in Ubuntu anzuzeigen?

Ist es möglich, den Inhalt eines laufenden Bash-Skripts aus dem RAM abzurufen?