testen ob programm installiert in script
testen ob programm installiert in script
hallo.
ich will ein script schreiben, das als erstes testet ob auf dem rechner php installiert ist, bevor es weiterarbeitet. aber ich weiß leider nicht, wie ich das in einem bash-script testen soll.
Kann mir einer einen rat geben?
Ich hab mir überlegt es über dem whereis kommando zu machen, aber wie dann weiter?
Vielen dank schonmal im vorraus
ich will ein script schreiben, das als erstes testet ob auf dem rechner php installiert ist, bevor es weiterarbeitet. aber ich weiß leider nicht, wie ich das in einem bash-script testen soll.
Kann mir einer einen rat geben?
Ich hab mir überlegt es über dem whereis kommando zu machen, aber wie dann weiter?
Vielen dank schonmal im vorraus
moin, moin,
Wenn das Shell-Script werden soll, geht's ganz einfach:
"which" als Ersatz für "whereis" ist praktischer, weil es einen vernünftigen
Exit Status liefert. Statt "php" muss dahinter evt. was anderes stehen, eben
der Name des Programms, das vom Script benutzt werden soll.
Wenn das ein cgi-Script werden soll: keine Ahnung
Wenn das Shell-Script werden soll, geht's ganz einfach:
Code: Alles auswählen
#!/bin/sh
if !(which php) ; then
echo "hier gibt es leider kein php"
exit
fi
# hier koennte man php nutzen
Exit Status liefert. Statt "php" muss dahinter evt. was anderes stehen, eben
der Name des Programms, das vom Script benutzt werden soll.
Wenn das ein cgi-Script werden soll: keine Ahnung

Beware of programmers who carry screwdrivers.
Code: Alles auswählen
test -x
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
Das kleine tool "test" ist extra für solche Fälle geschrieben. man test sagt, daß -x auf executable testet. Da test in einem script true oder false ausgeben kann (siehe manpage), sollte das ein Einzeiler sein.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
Code: Alles auswählen
test -x bla
Naja, which liefert dir auch nur die Dateien, die es über PATH finden kann. In Shell-Skripts sollte man wenn möglich zum einen PATH selbst setzen und/oder Programme immer nur mit vollem Pfad aufrufen.GoKi hat geschrieben:Dafür bräuchte man doch aber auch den vollen Pfad zu php (den man z.B. über which bekommt), oder?
PHP sollte eigentlich immer in /usr/bin/php liegen.
Ich weiß schon, was which macht.
Alles was ich sagen wollte, dass ein nicht funktioniert (sei denn php liegt zufällig im aktuellen Verzeichnis).
Und ich kenne auch genügend Rechner auf denen php selbstkompiliert ist und daher auch nicht in /usr/bin liegt.
Dem TE ging es doch darum php zu finden.
Alles was ich sagen wollte, dass ein
Code: Alles auswählen
test -x php
Und ich kenne auch genügend Rechner auf denen php selbstkompiliert ist und daher auch nicht in /usr/bin liegt.
Dem TE ging es doch darum php zu finden.
MfG GoKi
:wq
:wq
Dann kannst Du immernoch sowas wie machen.
Code: Alles auswählen
test -x $(which php)
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
ist das jetzt eine Variante von "cat /etc/passwd | grep root" oder macht
"test -x" tatsaechlich was anderes als "which"?
"test -x" tatsaechlich was anderes als "which"?
'man which' hat geschrieben: 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.
Beware of programmers who carry screwdrivers.
dieses Kommando liefert ähnlich wie das Kommando "true" immer "true" zurück :Kokopelli hat geschrieben:Dann kannst Du immernoch sowas wieCode: Alles auswählen
test -x $(which php)
Code: Alles auswählen
gms@gms1:~$ cat x.sh
#!/bin/bash
searchexe-test() {
if test -x $(which "$1" ); then
echo searchexe-test: found: $1
else
echo searchexe-test: not found: $1
fi
}
searchexe-which() {
if which "$1" &>/dev/null; then
echo searchexe-which: found: $1
else
echo searchexe-which: not found: $1
fi
}
searchexe-test bash
searchexe-which bash
searchexe-test c:\\windows-gibts-hier-nicht
searchexe-which c:\\windows-gibts-hier-nicht
gms@gms1:~$
gms@gms1:~$ ./x.sh
searchexe-test: found: bash
searchexe-which: found: bash
searchexe-test: found: c:\windows-gibts-hier-nicht
searchexe-which: not found: c:\windows-gibts-hier-nicht
gms
Hmm... das ist eine gute Frage.cosmac hat geschrieben:ist das jetzt eine Variante von "cat /etc/passwd | grep root" oder macht
"test -x" tatsaechlich was anderes als "which"?
Ich kann mich erinnern, dieses test -x vor einiger Zeit in einem script gesehen zu haben, in dem es recht intelligent eingesetzt wurde - dann habe ich es auf meine todo-Liste gesetzt, mir das mal näher anzusehen, bin aber auch noch nicht dazu gekommen... und habe keine Ahnung mehr, welches script das gewesen ist

Soweit ich das sehe, testet test -x, ob die angegebene Datei ausführbar ist. Wenn test dabei allerdings nur im aktuellen Verzeichnis sucht, benötigt man den vollen Pfad, was, aufgrund von which, test -x eigentlich überflüssig macht. Wozu ist es also gut? Evtl um in einem Set von Scripten zu überprüfen, ob alle davon ausführbar sind? Oder um zu testen, ob eine Datei an dem erwarteten Ort liegt?
Ich bin jetzt echt verwirrt.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
Sonst schau dir einfach mal die Manualpage von test an.
Da steht unter anderem das hier drin:
Code: Alles auswählen
man test
Code: Alles auswählen
-x DATEI
DATEI existiert und ist ausführbar
Oh, yeah!
Das macht Sinn. Danke!gms hat geschrieben:@Kokopelli
Du kannst mit "test -x " Dateien auf Ausführbarkeit testen, die nicht im PATH eingetragen sind, deren genaue Location du aber dafür kennen must
Also könnte man quasi ein script schreiben, das, wenn es zB php nicht im PATH (per which) findet, einige andere potentielle Orte danach abgrast? Andererseits wäre dann php nicht wirklich nutzbar, oder?
Das ist schon klar, die Frage hier war eher, ob dabei DATEI innerhalb des PATH gesucht wird (dann wäre test -x sogut wie identisch zu which) oder nur einen absoluten Pfad nimmt. Da letzteres der Fall zu sein scheint, stellte sich mir die Sinnfrage. Trotzdem Danke.Duff hat geschrieben:Sonst schau dir einfach mal die Manualpage von test an.
Da steht unter anderem das hier drin:Code: Alles auswählen
man test
Code: Alles auswählen
-x DATEI DATEI existiert und ist ausführbar
Noch eine Idee: Vielleicht test -x in Verbindung mit locate, um beispielsweise Executables zu finden, die nicht im PATH des Users liegen, aber für eine Anwendung benötigt werden. Das könnte zB etwas in sbin sein

Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
dann wuerde ich es so zusammenfassen: which ist fuer Menschen,
test -x fuer Maschinen. Auf der Kommandozeile geht man von einem
sinnvollen $PATH aus, in einem Script gerade nicht. Also kennt das
Script gefaelligst den kompletten Pfad und braucht kein which.
Dann gibt es noch einen wichtigen Unterschied: test ist ein interner
Befehl der bash, which ist ein externes Programm. Das steht nicht
unbedingt zur Verfuegung und kostet einen neuen Prozess.
test -x fuer Maschinen. Auf der Kommandozeile geht man von einem
sinnvollen $PATH aus, in einem Script gerade nicht. Also kennt das
Script gefaelligst den kompletten Pfad und braucht kein which.
Dann gibt es noch einen wichtigen Unterschied: test ist ein interner
Befehl der bash, which ist ein externes Programm. Das steht nicht
unbedingt zur Verfuegung und kostet einen neuen Prozess.
Beware of programmers who carry screwdrivers.
So macht das wirklich Sinn. Mit Hilfe von test kann das script dann ein paar potentielle Stellen abklopfen, an denen das gesuchte Programm liegen könnte, also zB /bin, /opt, /usr/local usw.cosmac hat geschrieben:dann wuerde ich es so zusammenfassen: which ist fuer Menschen,
test -x fuer Maschinen. Auf der Kommandozeile geht man von einem
sinnvollen $PATH aus, in einem Script gerade nicht. Also kennt das
Script gefaelligst den kompletten Pfad und braucht kein which.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
Re: testen ob programm installiert in script
Hallo jabbah und alle anderen,jabbah hat geschrieben:hallo.
ich will ein script schreiben, das als erstes testet ob auf dem rechner php installiert ist, bevor es weiterarbeitet. aber ich weiß leider nicht, wie ich das in einem bash-script testen soll.
Kann mir einer einen rat geben?
Ich hab mir überlegt es über dem whereis kommando zu machen, aber wie dann weiter?
Vielen dank schonmal im vorraus
zumindest in der bash ist es so, dass sie bei unbekannten Kommandos den exit-Status 127 zurückgibt. Das könnte man ohne 'test -x' und 'which' wie folgt ausnutzen, um zu testen ob ein Befehl existiert (genauer: in $PATH zu finden ist):
Code: Alles auswählen
#!/bin/bash
php --version &>/dev/null
if (($? == 127)); then
#Schritte wenn nicht gefunden
echo 'Kein PHP gefunden'
exit 1
fi
#Schritte wenn gefunden
echo 'PHP gefunden'
exit 0
Das "&>/dev/nul" ist nötig um sämtliche Ausgaben des Test-Aufrufs und eventuelle Fehlermeldungen der bash zu unterdrücken.
Wichtig ist außerdem, dass man einen Aufruf machen kann, der das zu prüfende Kommando/Programm auch sofort wieder verlässt, wie z.B. "php --version"
Vorteil dieser Variante: Keine Pfadangabe wie bei test -x und kein Aufruf von which/whereis
Nachteil: Der Komando-Testaufruf, egal wie rechenintensiv, wird ausgeführt wenn gefunden
Gruß,
tenaris