[gelöst] Fehler im *.sh SCRIPT

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Hannes007
Beiträge: 2
Registriert: 02.06.2010 16:00:08

[gelöst] Fehler im *.sh SCRIPT

Beitrag von Hannes007 » 02.06.2010 16:06:19

Hallo,

unter Suse Linux 11.2 / Kubuntu 10.04 habe ich mir ein Service-Menü angelegt.
Bis auf das Nachfolgende funktioniert alles bestens.

Bisher habe ich auf der Konsole mit dem Programm pdftk Anhänge an ein Pdf-File erzeugt.

Der Code lautete

Code: Alles auswählen

pdftk beispiel.pdf attach_files Anlage1.pdf Anlage2.pdf Anlage3.pdf output beispiel_mit_anhang.pdf
Das ganze habe ich nun in ein script gepackt ( oder zumindest versucht )

Code: Alles auswählen

#!/bin/sh
# PDF Tool Sammlung zum Einbinden in KDE Service Menüs

RETURN=""

#
# Prüfen, dass mindestens ein Argument übergeben wurde
#
if [ $# -lt 1 ] ; then
  echo "Bitte das Script nicht direkt aufrufen." > /dev/stderr
  exit 1
fi

#
# Fallunterscheidungen (anhand des ersten Parameters)
#
case "$1" in
	pdftk-attach-files)	# Usage: ./pdftk-tools.sh pdftk-attach-files <input.pdf>
		# Prüfe Parameteranzahl
		if [ $# -ne 2 ] ; then exit ; fi
		
		# Hole Benutzereingaben
		INPUT="$2"
		ATTACHMENTS=`kdialog --title "Anhängen auswählen" --multiple --getopenfilename ~/ "*.pdf"`
		if [ $? -ne 0 ] ; then exit ; fi # Abbrechen, falls der Dialog einfach geschlossen wurde (--> kdialog gibt Returncode 1 zurück)
		OUTPUT="$INPUT.attachments.pdf"
		
		# Starte pdftk
		RETURN=`pdftk "$INPUT" attach_files "$ATTACHMENTS" output "$OUTPUT" 2>&1`
	;;
	
	pdftk-bla)
		# irgendwas anders ...
	;;
esac

#
# Fehlermeldung ausgeben, wenn das letzte ausgeführte Kommando nicht fehlerfrei ausgeführt wurde
#
if [ $? -ne 0 ] ; then
	kdialog --title "Fehler" --error "$RETURN"
fi
Wenn ich im Konqueror oder im Dolphin eine Pdf-Datei mit der rechten Maustaste markiere und das script starte, öffnet sich ein
Fenster, indem ich auf der Festplatte die Dateien markieren kann, die ich als Anhang an das Pdf File haben möchte.
Anschließend wird eine Datei mit dem Namen xxx.attachments.pdf erzeugt. Leider hat diese Datei keine Anhänge. Woran kann das liegen?


mfg
Hannes
Zuletzt geändert von Hannes007 am 03.06.2010 16:45:53, insgesamt 1-mal geändert.

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

Re: Fehler im *.sh SCRIPT

Beitrag von Meillo » 02.06.2010 22:03:21

Hannes007 hat geschrieben: Das ganze habe ich nun in ein script gepackt ( oder zumindest versucht )
Ich habe die Fragestellung mal vom Ende des Textes hochgeholt:
Wenn ich im Konqueror oder im Dolphin eine Pdf-Datei mit der rechten Maustaste markiere und das script starte, öffnet sich ein
Fenster, indem ich auf der Festplatte die Dateien markieren kann, die ich als Anhang an das Pdf File haben möchte.
Anschließend wird eine Datei mit dem Namen xxx.attachments.pdf erzeugt. Leider hat diese Datei keine Anhänge. Woran kann das liegen?
Die schnelle Antwort: An vielem. ;-)

Grundsätzlich:
- gib dir Variablenwerte mit echo aus um zu debuggen
- `set -x' könnte interessant sein
- gebe vor jedem exit eine Meldung aus damit du weißt welches ausgeführt wurde


Dann will ich mal kommentieren was mir so auffällt. (Über manches wird man sicher streiten können, manches ist auch nicht relevant für deine Fragestellung.)

Code: Alles auswählen

RETURN=""
Variablennamen in der Shell müssen und sollen vor allem nicht aus Großbuchstaben bestehen, denn die in Großbuchstaben sind die reservierten Namen. `return' ist allerdings der Name eines Builtins; du müsstest die Variable dann umbenennen.

Code: Alles auswählen

if [ $# -lt 1 ] ; then
  echo "Bitte das Script nicht direkt aufrufen." > /dev/stderr
Besser wäre eine Meldung die sagt *wie* man das Programm aufrufen muss, nicht dass der Aufruf falsch war.

Code: Alles auswählen

case "$1" in
	pdftk-attach-files)	# Usage: ./pdftk-tools.sh pdftk-attach-files <input.pdf>
Dieser Kommentar ist die richtige Fehlermeldung für oben.

Code: Alles auswählen

		# Prüfe Parameteranzahl
		if [ $# -ne 2 ] ; then exit ; fi
Fehlermeldung ausgeben bevor beendet wird.

Code: Alles auswählen

		ATTACHMENTS=`kdialog --title "Anhängen auswählen" --multiple --getopenfilename ~/ "*.pdf"`
Zum Debuggen unbedingt $ATTACHMENTS mal ausgeben.

Code: Alles auswählen

		if [ $? -ne 0 ] ; then exit ; fi # Abbrechen, falls der Dialog einfach geschlossen wurde (--> kdialog gibt Returncode 1 zurück)
Erneut die fehlende Fehlermeldung.

Code: Alles auswählen

		# Starte pdftk
		RETURN=`pdftk "$INPUT" attach_files "$ATTACHMENTS" output "$OUTPUT" 2>&1`
$ATTACHMENTS kann mehrer Worte enthalten, da du bei kdialog --multiple angegeben hast.
Was passiert wenn du $ATTACHMENTS in Anführungszeichen setzst?
Hier könnte der Fehler liegen.

Stderr solltest du nicht auf stdout leiten. Im interaktiven Terminal kommen sowieso beide auf dem Terminal an. Wenn du es aber so wie hier machst und im Terminal stdout umleitest, dann verschwindet stderr ebenfalls in der Pipe. Das ist meist nicht gewollt.



Versuche selbst zu debuggen. Insbesondere $ATTACHMENTS.

Du kannst das Script ja auch zeilenweise in die interaktive Shell eingeben. Dann kannst du dir nach jeder Zeile alle Variablen anschauen.
Use ed once in a while!

Hannes007
Beiträge: 2
Registriert: 02.06.2010 16:00:08

Re: Fehler im *.sh SCRIPT

Beitrag von Hannes007 » 03.06.2010 16:45:33

Hallo,

danke für die Antwort.
Habe das SCRIPT zum laufen gebracht.

Hannes

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

Re: Fehler im *.sh SCRIPT

Beitrag von Meillo » 03.06.2010 17:02:28

Hannes007 hat geschrieben: danke für die Antwort.
Habe das SCRIPT zum laufen gebracht.
Und *wie*?

Denn das interessiert natürlich diejenigen die hier mitlesen.
Wir wollen hier nicht nur die Probleme von Nutzern lösen, sondern auch selbst was dabei lernen.
Es wäre also schön wenn du beschreiben könntest an was *genau* es gelegen hat und *wie* du es gelöst hast.
Use ed once in a while!

Antworten