testen ob programm installiert in script

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jabbah
Beiträge: 55
Registriert: 11.01.2006 11:38:47

testen ob programm installiert in script

Beitrag von jabbah » 23.01.2007 10:58:53

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

cosmac
Beiträge: 4579
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 23.01.2007 11:37:53

moin, moin,

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
"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 :(
Beware of programmers who carry screwdrivers.

jabbah
Beiträge: 55
Registriert: 11.01.2006 11:38:47

Beitrag von jabbah » 23.01.2007 11:40:42

vielen dank für die schnelle hilfe. das ist genau das, was ich gesucht habe. nur bin ich nicht auch which gekommen.

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 23.01.2007 11:47:35

Code: Alles auswählen

test -x
wäre eine Alternative.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

jabbah
Beiträge: 55
Registriert: 11.01.2006 11:38:47

Beitrag von jabbah » 24.01.2007 11:03:58

was ist mit test -x gemeint?

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 24.01.2007 12:09:01

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)

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 24.01.2007 12:20:13

Code: Alles auswählen

test -x bla
gibt true zurück, falls bla existiert und ausführbar ist. Ansonsten false. Wesentlich einfacher als obige Abfrage.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 24.01.2007 12:33:13

Dafür bräuchte man doch aber auch den vollen Pfad zu php (den man z.B. über which bekommt), oder?
MfG GoKi
:wq

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 24.01.2007 13:24:16

GoKi hat geschrieben:Dafür bräuchte man doch aber auch den vollen Pfad zu php (den man z.B. über which bekommt), oder?
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.
PHP sollte eigentlich immer in /usr/bin/php liegen.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 24.01.2007 15:14:54

Ich weiß schon, was which macht.
Alles was ich sagen wollte, dass ein

Code: Alles auswählen

test -x php
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.
MfG GoKi
:wq

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 24.01.2007 16:08:12

Dann kannst Du immernoch sowas wie

Code: Alles auswählen

test -x $(which php)
machen.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

cosmac
Beiträge: 4579
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 24.01.2007 20:02:55

ist das jetzt eine Variante von "cat /etc/passwd | grep root" oder macht
"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.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 24.01.2007 20:12:11

@cosmac, das habe ich mit meinen Posts versucht auszudrücken :)
MfG GoKi
:wq

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.01.2007 21:01:35

Kokopelli hat geschrieben:Dann kannst Du immernoch sowas wie

Code: Alles auswählen

test -x $(which php)
dieses Kommando liefert ähnlich wie das Kommando "true" immer "true" zurück :

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
Gruß
gms

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 26.01.2007 10:47:07

cosmac hat geschrieben:ist das jetzt eine Variante von "cat /etc/passwd | grep root" oder macht
"test -x" tatsaechlich was anderes als "which"?
Hmm... das ist eine gute Frage.
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 :roll:
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)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 26.01.2007 11:05:40

@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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.01.2007 11:10:55

Sonst schau dir einfach mal die Manualpage von test an.

Code: Alles auswählen

man test
Da steht unter anderem das hier drin:

Code: Alles auswählen

       -x DATEI
              DATEI existiert und ist ausführbar
Oh, yeah!

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 26.01.2007 11:13:14

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
Das macht Sinn. Danke!
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?
Duff hat geschrieben:Sonst schau dir einfach mal die Manualpage von test an.

Code: Alles auswählen

man test
Da steht unter anderem das hier drin:

Code: Alles auswählen

       -x DATEI
              DATEI existiert und ist ausführbar
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.

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)

cosmac
Beiträge: 4579
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 26.01.2007 14:09:04

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.
Beware of programmers who carry screwdrivers.

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 26.01.2007 14:12:57

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.
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.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

tenaris
Beiträge: 1
Registriert: 27.01.2007 01:19:49

Re: testen ob programm installiert in script

Beitrag von tenaris » 27.01.2007 01:55:39

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
Hallo jabbah und alle anderen,
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

Antworten