3131 Stimmen

Wie kann ich von einem Bash-Skript aus prüfen, ob ein Programm existiert?

Wie kann ich überprüfen, ob ein Programm existiert, und zwar so, dass es entweder einen Fehler zurückgibt und beendet wird oder mit dem Skript fortfährt?

Es sollte eigentlich ganz einfach sein, aber es hat mich nicht weitergebracht.

2 Stimmen

Was ist ein "Programm"? Beinhaltet es Funktionen und Aliasnamen? which gibt für diese den Wert true zurück. type ohne Argumente gibt zusätzlich true für reservierte Wörter und Shell-Builtins zurück. Wenn "Programm" bedeutet "auswählbar in $PATH ", dann siehe diese Antwort .

0 Stimmen

@TomHale Es hängt davon ab, welche Implementierung von which die Sie verwenden; diese wird nicht von der Bash, sondern z.B. von Debian's debianutils bereitgestellt.

6voto

zsh sólo aber sehr nützlich für zsh Skripting (z. B. beim Schreiben von Abschlussskripten):

El zsh/parameter Modul ermöglicht unter anderem den Zugriff auf die internen commands Hash-Tabelle. Von man zshmodules :

THE ZSH/PARAMETER MODULE
       The zsh/parameter module gives access to some of the internal hash  ta
       bles used by the shell by defining some special parameters.

[...]

       commands
              This  array gives access to the command hash table. The keys are
              the names of external commands, the values are the pathnames  of
              the  files  that would be executed when the command would be in
              voked. Setting a key in this array defines a new entry  in  this
              table  in the same way as with the hash builtin. Unsetting a key
              as in `unset "commands[foo]"' removes the entry  for  the  given
              key from the command hash table.

Obwohl es ein ladbares Modul ist, scheint es standardmäßig geladen zu sein, solange zsh wird nicht verwendet mit --emulate .

Beispiel:

martin@martin ~ % echo $commands[zsh]
/usr/bin/zsh

Um schnell zu prüfen, ob ein bestimmter Befehl verfügbar ist, prüfen Sie einfach, ob der Schlüssel im Hash vorhanden ist:

if (( ${+commands[zsh]} ))
then
  echo "zsh is available"
fi

Beachten Sie jedoch, dass der Hash alle Dateien in $PATH Ordner, unabhängig davon, ob sie ausführbar sind oder nicht. Um absolut sicher zu sein, müssen Sie eine stat anrufen:

if (( ${+commands[zsh]} )) && [[ -x $commands[zsh] ]]
then
  echo "zsh is available"
fi

6voto

blueyed Punkte 25926

hash foo 2>/dev/null : funktioniert mit der Z-Shell (Zsh), Bash, Gedankenstrich y Asche .

type -p foo : es scheint mit Z-Shell, Bash und Ash zu funktionieren ( BusyBox ), aber nicht Dash (es interpretiert -p als Argument).

command -v foo : funktioniert mit Z-Shell, Bash, Dash, aber nicht mit Ash (BusyBox) ( -ash: command: not found ).

Beachten Sie auch, dass builtin ist bei Asche und Dash nicht verfügbar.

0 Stimmen

Tolle Liste. Von welchen Versionen? Auf meinem System command -v foo arbeitet an busybox sh (BusyBox v1.22.1 (Debian 1:1.22.0-19+b3) eingebaute Shell (ash)). Sie schlägt korrekt mit 127 fehl, wenn foo nicht gefunden wird, und gibt den Pfad aus, wenn sie ihn findet.

0 Stimmen

Zum Beispiel type -p if funktioniert nicht.

5voto

Nathan Crause Punkte 765

Für diejenigen, die es interessiert: Keine der Methoden in den vorherigen Antworten funktioniert, wenn Sie eine installierte Bibliothek erkennen möchten. Ich kann mir vorstellen, dass Sie entweder den Pfad physisch überprüfen müssen (möglicherweise auf Header-Dateien und dergleichen), oder etwas wie das hier (wenn Sie eine Debian-basierte Distribution verwenden):

dpkg --status libdb-dev | grep -q not-installed

if [ $? -eq 0 ]; then
    apt-get install libdb-dev
fi

Wie Sie aus der obigen Abbildung ersehen können, bedeutet eine "0"-Antwort auf die Abfrage, dass das Paket nicht installiert ist. Dies ist eine Funktion von "grep" - eine "0" bedeutet, dass eine Übereinstimmung gefunden wurde, eine "1" bedeutet, dass keine Übereinstimmung gefunden wurde.

12 Stimmen

Allerdings ist das Anti-Muster cmd; if [ $? -eq 0 ]; then sollte umgestaltet werden zu if cmd; then

0 Stimmen

Dies funktioniert nur für Bibliotheken, die über dpkg o apt

5voto

Adam Davis Punkte 89506

El which könnte nützlich sein. Mann, der

Es gibt 0 zurück, wenn die ausführbare Datei gefunden wird, und 1, wenn sie nicht gefunden wird oder nicht ausführbar ist:

NAME

       which - locate a command

SYNOPSIS

       which [-a] filename ...

DESCRIPTION

       which returns the pathnames of the files which would
       be executed in the current environment, had its
       arguments been given as commands in a strictly
       POSIX-conformant shell. It does this by searching
       the PATH for executable files matching the names
       of the arguments.

OPTIONS

       -a     print all matching pathnames of each argument

EXIT STATUS

       0      if all specified commands are 
              found and executable

       1      if one or more specified commands is nonexistent
              or not executable

       2      if an invalid option is specified

Das Schöne an which ist, dass es herausfindet, ob die ausführbare Datei in der Umgebung verfügbar ist, die which eingelaufen ist - das erspart einige Probleme...

0 Stimmen

Verwenden Sie which, wenn Sie eine beliebige ausführbare Datei mit dem Namen foo suchen, aber lesen Sie meine Antwort, wenn Sie eine bestimmte Datei /path/to/a/named/foo überprüfen wollen. Beachten Sie auch, dass which auf einigen Minimal-Systemen nicht verfügbar sein könnte, obwohl es auf jeder vollwertigen Installation vorhanden sein sollte...

15 Stimmen

Verlassen Sie sich nicht auf den Exit-Status von which. Viele Betriebssysteme haben ein which, das nicht einmal einen anderen Exit-Status als 0 setzt.

3voto

Klevin Kona Punkte 345

Dies zeigt je nach Standort an, ob das Programm existiert oder nicht:

    if [ -x /usr/bin/yum ]; then
        echo "This is Centos"
    fi

0 Stimmen

Ja, ich habe dieses Kommando hinzugefügt, wenn Sie ein Paket im Server installieren müssen, Öffnen Sie Suse, Centos, Debian

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X