Shellscript: wie testen ob ein Programm installiert ist

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Shellscript: wie testen ob ein Programm installiert ist

Beitrag von Meillo » 04.12.2007 20:58:18

Das Szenario:
Ich habe ein Shellscript mit dem ich die Fotos von meiner Digicam auf den Rechner kopiere. Die Fotos werden von `exiftran' automatisch korrekt gedreht, falls sie hochkant auf genommen wurden.
Wenn ich das Script aber auf einem Rechner ohne `exiftran' starte, treten natürlich Fehler auf.


Wie finde ich auf elegante Weise heraus, ob `exiftran' installiert ist.
(Natürlich möchte ich das für beliebige andere Programme ebenso wissen.)


Bisher habe ich den Error-Code von z.B. `mogrify -version' angeschaut. Wenn der 0 war, dann habe ich es als installiert angesehen.
Um so zu verfahren, muss allerdings jedes Programm einen Aufruf haben, der nichts macht und erfolgreich zurückliefert.

Oder ich verwende `which', das 0 bzw. 1 wie gewünscht zurück liefert. Aber: ist `which' auch auf allen Systemen vorhanden? (Oder zumindest auf fast allen.)



Wie löst ihr das Problem?
Use ed once in a while!

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Beitrag von Snoopy » 04.12.2007 21:23:53

Hi

Naja eine einfache Lösung wäre z.B.

Code: Alles auswählen

which exiftran >/dev/null
if [ $? -ne 0 ];then
  echo "Ist kann kein Programm 'exiftran' lokalisieren !"
  echo "Ich verpisse mich dann wieder !"
  exit 1
fi
Wenn es immer ein Debian System ist, könnte man auch dpkg darauf ansetzen...andere Systeme haben evtl dpkg nicht, aber which sollte äusserst bekannt sein...das gehört fast (wenn nicht sogar immer) überall dazu.

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

Re: Shellscript: wie testen ob ein Programm installiert ist

Beitrag von gms » 04.12.2007 22:05:54

Meillo hat geschrieben: Oder ich verwende `which', das 0 bzw. 1 wie gewünscht zurück liefert. Aber: ist `which' auch auf allen Systemen vorhanden? (Oder zumindest auf fast allen.)
es wird schon auf den meisten Systemen verfügbar sein, bei Debian ist es z.B im essentiellen Paket "debianutils" verpackt.

wenn du jedoch ganz sicher gehen möchtest, kannst du auch den Shell Builtin Command "type" benutzen, z.B.:

Code: Alles auswählen

#!/bin/bash

if ! type -p exiftran; then
  echo und tschüss >&2
  exit 1
fi

Benutzeravatar
startx
Beiträge: 3165
Registriert: 07.12.2002 19:29:48
Wohnort: london

Beitrag von startx » 04.12.2007 22:33:01

wenn du hier von einer installation auf einem debian paket ausgehst,
reicht auch ein:

Code: Alles auswählen

dpkg -s exiftran
das liefert dann negativ:

Code: Alles auswählen

~$ dpkg -s exiftran
Package `exiftran' is not installed and no info is available.
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
oder positiv

Code: Alles auswählen

~$ dpkg -s exiftran
Package: exiftran
Status: install ok installed
ansonsten (eleganter) : wenn du das programm anderen anbieten willst solltest du eh
ein sauberes debian (oder rpm) paket erstellen und nimmst exiftran einfach in die abhaengigkeiten auf.
dann wird es entweder automatisch mitinstalliert (wenn noch nicht vorhanden) oder die installation wird
abgebrochen (wenn nicht einmal verfuegbar)

weiterer vorteil ist dass du auch angeben kannst , welche exiftran version benoetigt wird.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shellscript: wie testen ob ein Programm installiert ist

Beitrag von Meillo » 05.12.2007 00:25:28

gms hat geschrieben:wenn du jedoch ganz sicher gehen möchtest, kannst du auch den Shell Builtin Command "type" benutzen
Danke für den Tipp.

Allerdings ist `type' auch nur in der Bash ein Builtin. Die `sh' hat es nicht (und `type' gehört wohl auch nicht zum POSIX)

... bessere Alternativen sind also weiterhin willkommen.


startx hat geschrieben:wenn du hier von einer installation auf einem debian paket ausgehst
Nein, ich möchte meine Lösung möglichst nur auf POSIX basieren :-)

ansonsten (eleganter) : wenn du das programm anderen anbieten willst solltest du eh ein sauberes debian (oder rpm) paket erstellen und nimmst exiftran einfach in die abhaengigkeiten auf.
Das ist geplant ... zusätzlich.
Use ed once in a while!

Benutzeravatar
uljanow
Beiträge: 529
Registriert: 20.09.2005 21:14:00

Beitrag von uljanow » 05.12.2007 07:13:50

Ich würde "set -e" benutzen. Falls ein Fehler im Skript auftaucht, wird abgebrochen. Wenn man Aufräumarbeiten nach einem Abbruch machen will, kann man trap benutzen.

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

Re: Shellscript: wie testen ob ein Programm installiert ist

Beitrag von gms » 05.12.2007 08:51:45

Meillo hat geschrieben:
gms hat geschrieben:wenn du jedoch ganz sicher gehen möchtest, kannst du auch den Shell Builtin Command "type" benutzen
Danke für den Tipp.

Allerdings ist `type' auch nur in der Bash ein Builtin. Die `sh' hat es nicht (und `type' gehört wohl auch nicht zum POSIX)

... bessere Alternativen sind also weiterhin willkommen.
Das "type" Kommando gibt es unter der Bourne Shell und auch die neueren Korn Shell Versionen ( u.a auf AIX, SunOS und HP-UX ) haben einen diesbezüglichen Shell Builtin-Alias definiert ( allerdings ohne der "-p" Option).
Deine neue "POSIX" Zielvorgabe kann über ein einfaches Kommando nicht erfüllt werden, "type" ist jedoch noch am ehesten drann.
Als Alternative bleibt noch z.B ein Parsen der PATH Environmentvariablen und ein anschließendes Durchsuchen dieser Verzeichnisse, z.B über eine selbst geschriebene Shellfunktion

Gruß
gms

edit:so wird z.B von einem über "autoconf" generierten "configure" Script nach einem Programm ( als Beispiel "awk" ) gesucht:

Code: Alles auswählen

#!/bin/sh
PATH_SEPARATOR=":"
ac_executable_extensions=
as_executable_p="test -f"

ac_word=awk
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  for ac_exec_ext in '' $ac_executable_extensions; do
  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
   echo "found '$as_dir/$ac_word$ac_exec_ext'"
   break 2
  fi
done
done
IFS=$as_save_IFS
Das sollte also nach dem Setzen der OS-spzeifischen Variablen, wie z.B "PATH_SEPARATOR" und "ac_executable_extensions" auf allen POSIX Systemen laufen

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shellscript: wie testen ob ein Programm installiert ist

Beitrag von Meillo » 06.12.2007 21:02:42

gms hat geschrieben:Deine neue "POSIX" Zielvorgabe kann über ein einfaches Kommando nicht erfüllt werden, "type" ist jedoch noch am ehesten drann.
Ich denke, ich werde auf `type' setzen.

Das Kommando erscheint mir logisch und es ist wohl fast überall vorhanden ... das sollte genügen.

Danke.
Use ed once in a while!

Antworten