Shellscript: wie testen ob ein Programm installiert ist
Shellscript: wie testen ob ein Programm installiert ist
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?
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!
- Snoopy
- Beiträge: 4297
- Registriert: 17.11.2003 18:26:56
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rh.- Pflz.
Hi
Naja eine einfache Lösung wäre z.B.
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.
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
Re: Shellscript: wie testen ob ein Programm installiert ist
es wird schon auf den meisten Systemen verfügbar sein, bei Debian ist es z.B im essentiellen Paket "debianutils" verpackt.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.)
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
wenn du hier von einer installation auf einem debian paket ausgehst,
reicht auch ein:
das liefert dann negativ:
oder positiv
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.
reicht auch ein:
Code: Alles auswählen
dpkg -s exiftran
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.
Code: Alles auswählen
~$ dpkg -s exiftran
Package: exiftran
Status: install ok installed
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.
Re: Shellscript: wie testen ob ein Programm installiert ist
Danke für den Tipp.gms hat geschrieben:wenn du jedoch ganz sicher gehen möchtest, kannst du auch den Shell Builtin Command "type" benutzen
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.
Nein, ich möchte meine Lösung möglichst nur auf POSIX basierenstartx hat geschrieben:wenn du hier von einer installation auf einem debian paket ausgehst
Das ist geplant ... zusätzlich.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.
Use ed once in a while!
Re: Shellscript: wie testen ob ein Programm installiert ist
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).Meillo hat geschrieben:Danke für den Tipp.gms hat geschrieben:wenn du jedoch ganz sicher gehen möchtest, kannst du auch den Shell Builtin Command "type" benutzen
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.
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
Re: Shellscript: wie testen ob ein Programm installiert ist
Ich denke, ich werde auf `type' setzen.gms hat geschrieben:Deine neue "POSIX" Zielvorgabe kann über ein einfaches Kommando nicht erfüllt werden, "type" ist jedoch noch am ehesten drann.
Das Kommando erscheint mir logisch und es ist wohl fast überall vorhanden ... das sollte genügen.
Danke.
Use ed once in a while!