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.
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.
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
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.
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.
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.
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...
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...
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.
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 .1 Stimmen
Ebenfalls relevant ist Wie kann man mit 'hash -r' alle Shells aktualisieren? y Wann sollen ausführbare Dateien in $PATH mit der Bash aufbereitet werden?
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.