Ich versuche, alle meine sh
Startup / Env-Skripte so zu schreiben , dass sie mit so viel DRY und so viel wie möglich funktionieren: "Funktioniert auf jedem * nix, auf das ich es klone". Dies bedeutet, dass der Code ordnungsgemäß fehlschlägt, wenn ich versuche, Code auszuführen, der nicht vorhanden ist. Zu diesem Zweck muss ich testen können, ob Programme vorhanden sind. Ich weiß, wie man prüft, ob eine Datei vorhanden ist, aber ich bin nicht sicher, wie man prüft, ob eine Anwendung im Pfad ausführbar ist. Ich würde lieber den $ PATH verwenden, da einige von diesen auf Arch, Ubuntu und Centos arbeiten müssen. Einige werden möglicherweise in meinem Homedir auf Systemen installiert, auf denen ich kein Root-Verzeichnis habe, andere werden möglicherweise nicht installiert, und andere werden möglicherweise in Systempfaden installiert.
quelle
Antworten:
Verwenden Sie
type commandname
. Dies gibt true zurück, wenncommandname
etwas ausführbar ist: Alias, Funktion, eingebauter oder externer Befehl (nachgeschlagen in$PATH
). Alternativ können Sie auchcommand commandname
den Wert true verwenden, wenncommandname
es sich um einen eingebauten oder einen externen Befehl handelt (der nachgeschlagen wurde$PATH
).Es gibt einige sh-Varianten (definitiv vor POSIX; ich kenne
/bin/sh
OSF1 ≤3.x und einige Versionen der Almquist-Shell, die in früheren NetBSD-Versionen und einigen Linux-Distributionen des 20. Jahrhunderts enthalten waren), bei denentype
immer 0 zurückgegeben wird oder nicht existieren. Ich glaube nicht, dass in diesem Jahrtausend Systeme mit diesen ausgeliefert wurden. Wenn Sie jemals auf sie stoßen, können Sie mit der folgenden Funktion$PATH
manuell suchen :Diese Funktion ist im Allgemeinen nützlich, wenn Sie integrierte Funktionen ausschließen und den Namen in nachschlagen möchten
$PATH
. Die meisten Shells verfügen über eine integrierte Funktioncommand -v
, obwohl es sich um eine relativ neue POSIX-Erweiterung handelt (ab POSIX: 2004 immer noch optional). Dies ist im Grunde eine programmiererfreundliche Version vontype
: Sie gibt den vollständigen Pfad für eine ausführbare Datei$PATH
, den bloßen Namen für eine integrierte Funktion und eine Aliasdefinition für einen Alias aus.Ksh, bash und zsh müssen auch
type -p
nur ausführbare Dateien in suchen$PATH
. Beachten Sie, dass in bash der Rückgabestatustype -p foo
0 ist, wennfoo
es sich um eine integrierte Funktion handelt. Wenn Sie auf eine ausführbare Datei in testen möchten$PATH
, müssen Sie sicherstellen, dass die Ausgabe nicht leer ist.type -p
ist nicht in POSIX; Zum Beispiel hat Debians Asche (die/bin/sh
auf Ubuntu ist) es nicht.quelle
if [ type keychain ]; then
nicht funktionieren? Ich bekomme eine Fehlermeldung,/home/xenoterracide/.zshrc:84: parse error: condition expected: type
ich nehme an, ich könnte schreiben, dass die Funktion existiert ... Ich dachte nur, dass dies inif type $APP >/dev/null 2>/dev/null; then ...
Sie wollen das nicht[]
.type -p
wenn Sie speziell nach einem Befehl in suchen$PATH
(keine Aliase oder Funktionen oder eingebauten).Wenn Sie nur nach externen Programmen suchen, können Sie auch welche verwenden. Ich weiß allerdings nicht, wie portabel das ist.
quelle
type
odercommand
;which
ist zum Beispiel nicht in POSIX. In der Praxiswhich
gibt es fast überall, aber an einigen Stellen (wo es als csh-Skript implementiert ist) wird ein anderer Pfad verwendet (aufgrund von a.cshrc
), der den Zweck zunichte macht.