[linux-l] Re: Existenz eines Programmes herausfinden

Mike Dornberger Mike.Dornberger at gmx.de
Do Apr 13 23:04:41 CEST 2006


Hi,

On Thu, Apr 13, 2006 at 03:20:28AM +0200, Volker Grabsch wrote:
> On Thu, Apr 13, 2006 at 02:49:14AM +0200, Mike Dornberger wrote:
> > On Wed, Apr 12, 2006 at 10:44:19PM +0200, Volker Grabsch wrote:
> > > Mein persönlicher Favorit war übrigens (in Perl):
> > >     system("$BEFEHL --help >/dev/null 2>/dev/null") == 0
> > > 
> > > (Natürlich kommt $BEFEHL nur aus einer fest eingebauten Liste.)
> > 
> > was machst du, wenn $BEFEHL --help nicht unterstützt? Also einen Fehler
> > wirft oder die Kommandozeilen nicht beachtet/falsch interpretiert und dann
> > $IRGENDWAS macht (rm -rf / *g*)?
> 
> Ein Programm, das bei "BEFEHL --help" irgendwas Dummes macht, wird
> es ganz sicher niemals in die Compiler-Suites schaffen. Ich habe
> alle Kandidaten überprüft, selbst "dllwrap" und "windres" verhalten
> sich bei "--help" korrekt.

du wolltest was "generisches", nicht was "compilergenerisches" haben,
schriebst du. :) Und generisch kann es eben sein, daß dosomething etwas
macht und dabei die Kommandozeile halt ignoriert. Ich jedenfalls würde
niemals ein Programm aufrufen, nur um zu testen, ob es (in $PATH) existiert.

> Was die Programm-Ausgabe angeht: Die kann die Shell gar nicht falsch
> verstehen, sie leitet das alles schließlich nach /dev/null. Das

Mit Fehler werfen meinte ich halt den Rückgabewert (exit value); mit
Kommandozeile nicht/falsch interpretieren halt sowas wie ARGV wird von
$BEFEHL nicht ausgewertet oder das Programm kennt keine langen Parameter.

> einzige blöde, das passieren kann, ist dass das Programm bei "--help"
> mit nem Fehler (Exitcode != 0) abbricht. Und diese einzige Sorge
> hat sich in der Praxis nichtmal bestätigt.

Nunja, nur weil es in 10 Fällen nicht passiert, heißt ja nicht, daß es nie
passieren wird. :)

> Aber "command -v" ist mit Abstand die beste Lösung, das musst du
> zugeben ... :-)

Hm, gibt einem auch Aliase und Shell-Funktionen zurückgeben:

(unalias ls; unset ls; command -v ls; alias ls='ls --color=auto'; command -v
ls; function ls { echo xyz; }; ls; command -v ls; unalias ls; command -v ls)

gibt mir unter bash folgendes zurück:

/bin/ls
alias ls='ls --color=auto'
xyz
alias ls='ls --color=auto'
ls

Und offenbar bevorzugt command Aliase, denn wenn ich die Definition von
Alias und Funktion vertausche, gibt das dahinterstehende command auch die
alias-Zeile aus.

Wenn also die Aufgabe heißt "Durchsuche $PATH, ob $BEFEHL vorhanden ist",
würde ich command -v auch nicht benutzen. Müßte ich mir aber nochmal
durchdenken, ob diese Fälle zu unerwartetem Fehlverhalten des Programmes
führen könnte. (Vielleicht sogar zu einem sicherheitskritischer Fehler?)

Gruß,
 Mike




Mehr Informationen über die Mailingliste linux-l