Da meine Tochter Probleme mit der auto-Option von dvdwizard hat, hat sie sich ein kleines Shellscript gebaut, das auch grundsätzlich funktioniert, wenn man die letzte Ausgabe direkt an die Shell verfüttert und nicht per Script aufruft. Ich erkenne auch nicht, was da beim Quoten falsch ist. Vielleicht hat wer eine Idee. Bitte beim Script nicht allzu kritisch sein. Das Mädel ist erst 13. Das ganze Script ist komprimiert angehängt. Auszug daraus, der den Problemteil betrifft: DVDWIZARDOPTION="-T \"""$DVDNAME""\"" for FILM in `ls "$AUTHORINGQUELLE"/*.mpg`; do #echo $FILM FILMTITEL=`basename "$FILM" .mpg | sed -e 's/_/ /g'` #echo $FILMTITEL DVDWIZARDOPTION="$DVDWIZARDOPTION"" -t \"""$FILMTITEL""\" `basename $FILM`" done DVDWIZARDOPTION="$DVDWIZARDOPTION"" -c 600" echo "dvdwizard $DVDWIZARDOPTION" dvdwizard $DVDWIZARDOPTION Wird die echo-Ausgabe in die Shell-kopiert läuft dvdwizard, wird es direkt aus dem Script ausgerufen, werden die Optionen nicht richtig interpretiert. Irgendwelche Quoting-Ideen? Al
Hallo, Am Thu, 16 Feb 2006, Al Bogner schrieb:
Da meine Tochter Probleme mit der auto-Option von dvdwizard hat, hat sie sich ein kleines Shellscript gebaut, das auch grundsätzlich funktioniert, wenn man die letzte Ausgabe direkt an die Shell verfüttert und nicht per Script aufruft. Ich erkenne auch nicht, was da beim Quoten falsch ist. Vielleicht hat wer eine Idee. Bitte beim Script nicht allzu kritisch sein. Das Mädel ist erst 13.
Das ganze Script ist komprimiert angehängt.
Bitte nimm wenn's nur eine Datei ist nur "gzip" und nicht tar. Ein .txt.gz (oder .sh.gz usw.) kann man direkt an less pipen.
Auszug daraus, der den Problemteil betrifft:
DVDWIZARDOPTION="-T \"""$DVDNAME""\""
Das sind ein paar "" zuviel die aber nicht stoeren sollten.
for FILM in `ls "$AUTHORINGQUELLE"/*.mpg`; do #echo $FILM FILMTITEL=`basename "$FILM" .mpg | sed -e 's/_/ /g'` #echo $FILMTITEL DVDWIZARDOPTION="$DVDWIZARDOPTION"" -t \"""$FILMTITEL""\" `basename $FILM`" done DVDWIZARDOPTION="$DVDWIZARDOPTION"" -c 600" echo "dvdwizard $DVDWIZARDOPTION" dvdwizard $DVDWIZARDOPTION
Ruf das mal mit: set -x echo dvdwizard $DVDWIZARDOPTION >/dev/null auf und maile die Ausgabe (die Zeile, die mit '+ echo' beginnt); dort sieht man wie genau dvdwizard die Argumente uebergeben bekommt. Ich vermute mal, dass da Quotezeichen fehlen oder zuviel sind. Ansonsten hab ich's mal etwas umgeschrieben und angehaengt ;) -dnh -- "If affirmative action means what I just described, what I'm for, then I'm for it." George W. Bush -- Presidential Debates. St. Louis, Mo., 2000/10/18
Am Freitag, 17. Februar 2006 01:25 schrieb David Haller: Hallo David,
Ansonsten hab ich's mal etwas umgeschrieben und angehaengt ;)
Danke. Da passt eine Kleinigkeit nicht beim HD-Platz, das ist aber für das Funktionieren völlig egal, ich habe daher dein Script nicht geändert und rufe deine unveränderte Version auf: dvd_authoren_dh.sh_\[axMjhb\].sh TEST_TITEL /media_out_nfs/scripttest/ 19:24:27 START DVD-AUTORING Quelle /media_out_nfs/scripttest TEST TITEL wird erstellt Auf sind noch mindestens GB frei /usr/local/bin/dvd_authoren_dh.sh_[axMjhb].sh: line 39: test: -lt: unary operator expected + dvdwizard -c 600 -T ''\''TEST' 'TITEL'\''' -t ''\''film1' 'scripttest'\''' ''\''film1_scripttest.mpg'\''' -t ''\''film2' 'scripttest'\''' ''\''film2_scripttest.mpg'\''' Specified input file TITEL' not found. Aborting Usage: dvdwizard [options] mpeg-file(s) miscellaneous options: ... + set +x 19:24:27 ENDE DVD-AUTORING Al
Hallo, Am Fri, 17 Feb 2006, Al Bogner schrieb:
Am Freitag, 17. Februar 2006 01:25 schrieb David Haller:
Ansonsten hab ich's mal etwas umgeschrieben und angehaengt ;)
Danke. Da passt eine Kleinigkeit nicht beim HD-Platz, das ist aber für das Funktionieren völlig egal, ich habe daher dein Script nicht geändert und rufe deine unveränderte Version auf:
dvd_authoren_dh.sh_\[axMjhb\].sh TEST_TITEL /media_out_nfs/scripttest/
19:24:27 START DVD-AUTORING Quelle /media_out_nfs/scripttest TEST TITEL wird erstellt Auf sind noch mindestens GB frei
Zeig mal die Ausgabe von df -P "$AUTHORINGQUELLE", also hier df -P /media_out_nfs/scripttest/ Evtl. sieht bei deinem df die Ausgabe anders aus, dann musst du das Feld beim awk anpassen. Hier: Filesystem 1k-blocks Used Available Use% Mounted on /dev/hdb10 34036904 25353064 7992244 76% /mnt/hdb10 d.h. $4 ist "Available".
/usr/local/bin/dvd_authoren_dh.sh_[axMjhb].sh: line 39: test: -lt: unary operator expected
Folgefehler. Ergaenze da bitte zu: test -n "$FREI" || exit 3 echo "Auf sind noch mindestens $FREI GB frei" if test $FREI -lt 5; then oder ggfs. mit Fehlermeldung.
+ dvdwizard -c 600 -T ''\''TEST' 'TITEL'\''' -t ''\''film1' 'scripttest'\''' ''\''film1_scripttest.mpg'\''' -t ''\''film2' 'scripttest'\''' ''\''film2_scripttest.mpg'\'''
Mist. Zuviel gequoted. Testhalber mal so: DVDWIZARDOPTION="$DVDWIZARDOPTION -t \"$FILMTITEL\" \"`basename $FILM`\"" Ansonsten kann man sich bei der bash auch mit einem Array helfen, in das man die Argumente einzeln hineinstopft: declare -a DVDWIZOPTS DVDWIZOPTS=( "-c" "600" "-T" "$DVDNAME" ) i=4 for FILM in "${AUTHORINGQUELLE}/"*.mpg; do FILMTITEL="`basename \"$FILM\" .mpg | sed -e 's/_/ /g'`" DVDWIZOPTS[$i]="-t"; i=$[i+1] DVDWIZOPTS[$i]="$FILMTITEL"; i=$[i+1] DVDWIZOPTS[$i]="`basename \"$FILM\"`"; i=$[i+1] done set -x dvdwizard "${DVDWIZOPTS[@]}" set +x So sollte das eigentlich klappen, ich hab das mal mit: dvdwizard() { for x; do echo -n "'$x'"; test -e "$x" && echo " ok" || echo " NOK" ; done } getestet, da ich dvdwizard nicht habe, das gibt bei den Titeln und anderen Optionen ein NOK aber bei den Dateinamen kommt "ok", auch bei Leerzeichen im Dateinamen. Das mit nem Array oft ne gute Loesung, wenn man Argumente (ggfs. mit Leerzeichen) weitergeben will. Das quoten ist sonst wirklich muehsam. -dnh -- 136: Deadline Programmtod durch überhastete Weiterentwicklung eines falsch konstruierten Entwurfsmusters. (Lutz Donnerhacke)
Am Freitag, 17. Februar 2006 20:15 schrieb David Haller: Hallo David,
Am Fri, 17 Feb 2006, Al Bogner schrieb:
Am Freitag, 17. Februar 2006 01:25 schrieb David Haller:
Ansonsten hab ich's mal etwas umgeschrieben und angehaengt ;)
Danke. Da passt eine Kleinigkeit nicht beim HD-Platz, das ist aber für das Funktionieren völlig egal, ich habe daher dein Script nicht geändert und rufe deine unveränderte Version auf:
dvd_authoren_dh.sh_\[axMjhb\].sh TEST_TITEL /media_out_nfs/scripttest/
19:24:27 START DVD-AUTORING Quelle /media_out_nfs/scripttest TEST TITEL wird erstellt Auf sind noch mindestens GB frei
Zeig mal die Ausgabe von df -P "$AUTHORINGQUELLE", also hier
df -P /media_out_nfs/scripttest/
df -P /media_out_nfs/scripttest/ Dateisystem 1024-Blöcke Benutzt Verfügbar Kapazit. Eingehängt auf 192.168.1.100:/media_out 133105728 106916608 26189120 81% /media_out_nfs
Evtl. sieht bei deinem df die Ausgabe anders aus, dann musst du das Feld beim awk anpassen. Hier:
Filesystem 1k-blocks Used Available Use% Mounted on /dev/hdb10 34036904 25353064 7992244 76% /mnt/hdb10
d.h. $4 ist "Available".
# uname -r 2.6.13-15.7-default # cat /etc/issue Welcome to SUSE LINUX 10.0 (i586) - Kernel \r (\l). # awk --version GNU Awk 3.1.4 df --version df (GNU coreutils) 5.3.0 # df -P /media_out_nfs/scripttest | awk '/^\//{print $1;}' # df -P /media_out_nfs/scripttest | awk '/^\//{print $2;}' # df -P /media_out_nfs/scripttest | awk '/^\//{print $3;}' # df -P /media_out_nfs/scripttest | awk '/^\//{print $4;}' # df -P /media_out_nfs/scripttest | awk '/^\//{print $5;}' # df -P /media_out_nfs/scripttest | awk '/^\//{print $6;}' Da kommt nichts -P POSIX output format Das sollte doch bewirken, dass die Ausgabe unabhängig von locales ist.
/usr/local/bin/dvd_authoren_dh.sh_[axMjhb].sh: line 39: test: -lt: unary operator expected
Folgefehler. Ergaenze da bitte zu:
test -n "$FREI" || exit 3 echo "Auf sind noch mindestens $FREI GB frei"
Ok, da fliege ich wie zu erwarten raus, da das mit awk nicht funktioniert. Ich kommentiere das mal aus.
if test $FREI -lt 5; then
oder ggfs. mit Fehlermeldung.
+ dvdwizard -c 600 -T ''\''TEST' 'TITEL'\''' -t ''\''film1' 'scripttest'\''' ''\''film1_scripttest.mpg'\''' -t ''\''film2' 'scripttest'\''' ''\''film2_scripttest.mpg'\'''
Mist. Zuviel gequoted. Testhalber mal so:
DVDWIZARDOPTION="$DVDWIZARDOPTION -t \"$FILMTITEL\" \"`basename $FILM`\""
/usr/local/bin/dvd_authoren_dh.sh_[axMjhb].sh: line 42: test: -lt: unary operator expected + dvdwizard -c 600 -T ''\''TEST' 'TITEL'\''' -t '"film1' 'scripttest"' '"film1_scripttest.mpg"' -t '"film2' 'scripttest"' '"film2_scripttest.mpg"' Specified input file TITEL' not found. Aborting
Ansonsten kann man sich bei der bash auch mit einem Array helfen, in das man die Argumente einzeln hineinstopft:
David, das soll ein 13-jähriges Mädchen verstehen. Ich bin schon sehr froh darüber, dass sie das ursprüngliche Script mit etwas Hilfe geschafft hat. Man darf auch nicht vergessen, dass sie das Script nicht aus Freude am Scripten schrieb, sondern weil sie sich damit das Erstellen einer DVD erleichtern will. Auf die Array-Variante möchte ich erst dann zurück kommen, wenn es anders nicht klappt. Es ist mir wichtig, dass sie versteht, was da passiert, sonst wird sie bei nächster Gelegenheit nicht motiviert sein, da selber was zu schreiben. Es ist ihr 2. Shellscript. Al
Hallo, Am Fri, 17 Feb 2006, Al Bogner schrieb:
Am Freitag, 17. Februar 2006 20:15 schrieb David Haller: [..]
Zeig mal die Ausgabe von df -P "$AUTHORINGQUELLE", also hier
df -P /media_out_nfs/scripttest/
df -P /media_out_nfs/scripttest/ Dateisystem 1024-Blöcke Benutzt Verfügbar Kapazit. Eingehängt auf 192.168.1.100:/media_out 133105728 106916608 26189120 81% /media_out_nfs [..] # df -P /media_out_nfs/scripttest | awk '/^\//{print $4;}'
Da kommt nichts
Ah, das liegt daran, dass du ueber's Netz mountest und der Mountpunkt also nicht mit einem '/' sondern ner '1' beginnt. Folgendes muesste klappen: | awk '/^([0-9.]+:)?\//{print $4;}' Das matcht simpelst auf eine IP gefolgt von einem ':' und dann nem '/'. Ansonsten ist's evtl einfacher so zu machen: LANG="C" ## gleich am Anfang des scriptes, oder im `` vor df. FREI=`df -P "${AUTHORINGQUELLE}" \ | awk '! /^Filesystem/{printf "%i", $4 / 1048576; }'`
Mist. Zuviel gequoted. Testhalber mal so:
DVDWIZARDOPTION="$DVDWIZARDOPTION -t \"$FILMTITEL\" \"`basename $FILM`\""
/usr/local/bin/dvd_authoren_dh.sh_[axMjhb].sh: line 42: test: -lt: unary operator expected + dvdwizard -c 600 -T ''\''TEST' 'TITEL'\''' -t '"film1' 'scripttest"' '"film1_scripttest.mpg"' -t '"film2' 'scripttest"' '"film2_scripttest.mpg"' Specified input file TITEL' not found. Aborting
Hast du wirklich die '\"' auch um $FILMTITEL angegeben? Sieht eher danach aus, als haettest du da noch die '' gelassen ;) Ansonsten kannst du's mal ganz ohne "inneres" quoten versuchen, aber da kann's gut sein, dass es dann mit Titel / Dateinamen mit Leerzeichen nicht klappt. Du kannst auch noch IFS aendern. Aber s.u. es wird auf jeden Fall ne Quaelerei.
Ansonsten kann man sich bei der bash auch mit einem Array helfen, in das man die Argumente einzeln hineinstopft:
David, das soll ein 13-jähriges Mädchen verstehen. Ich bin schon sehr froh darüber, dass sie das ursprüngliche Script mit etwas Hilfe geschafft hat. Man darf auch nicht vergessen, dass sie das Script nicht aus Freude am Scripten schrieb, sondern weil sie sich damit das Erstellen einer DVD erleichtern will.
Ja, schon klar. Aber erstens war das script ja schon ziemlich gut und das mit dem Argumente stueckweise zusammenbasteln ist eben eines der vom Quoten her schwierigsten Dinge ueberhaupt... Schau dir nur mal an wie ich das auch nicht direkt hinbekomme! Und wie komplex das durch's 'set -x' Ausgegebene ist.
Auf die Array-Variante möchte ich erst dann zurück kommen, wenn es anders nicht klappt.
Ist einfacher und bei so einem Fall absolut angebracht. Kennt sie das Konzept "Array" schon? Naja, ich denke, das kannst du erklaeren ;) Ansonsten melde dich und/oder sag ihr, sie soll sich melden (per PM, s.u.).
Es ist mir wichtig, dass sie versteht, was da passiert, sonst wird sie bei nächster Gelegenheit nicht motiviert sein, da selber was zu schreiben. Es ist ihr 2. Shellscript.
ACK. Das mit diesem Quotingproblem zu verstehen geht halt leider nicht so einfach, da habe auch ich noch Probleme mit, das konkret bis ins Detail nachzuvollziehen -- und auch ich scheitere regelmaessig daran, kenne aber den Ausweg mit der Arrayvariablen... Es ist einfach eine Besonderheit, wenn man Argumente zusammenbasteln will, die man dann an einen aufzurufenden Befehl uebergibt. Glaube mir, nimm das mit dem Array, denn das kann man dann einfach und "korrekt" via "${arrayvar[@]}" uebergeben. Ohne Array ist es ne Quaelerei und funktioniert oft trotzdem nicht. Ansonsten gib' ihr erstmal ein dickes Lob fuer's gute Quoten weiter, in ihrer Version gab's nur ein paar Stellen, wo sie fuer schwierige[2] Faelle zu wenig gequoted hat. Und eben x="$foo""bar" Sachen, wo die "" in der Mitte ueberfluessig sind -- aber auch nicht schaden. Meine ersten Scripte waren wesentlich schlechter! Und mach ihr klar, dass sie am IMHO schwierigsten Problem beim shell-script schreiben "haengengeblieben" ist. Alle anderen Verbesserungen in meiner Version betreffen keine "Fehler" sondern sind eher Stil-[3] und/oder Effizienzfragen[4] und/oder beruecksichtigen zumindest teilweise schwierige Faelle wie [2]. Und ich erklaere ihr gerne meine Aenderungen, was hier aber OT waere. BTW: meine Erklaerungen / Aenderungen bisher waren eher auf dich als Vermittler gemuenzt, weniger direkt fuer sie. Ich kann auch anders ;) -dnh PS: du kannst ihr gern meine PM weitergeben, wenn sie Fragen hat, gerade was "warum so und nicht einfach ..." Fragen angeht... Ansonsten sind solche (weitere) (Detail-)Fragen in suse-programming generell besser aufgehoben. Ausserdem ist da wenig los und Jan Trippler scheint z.Z. suse-programming zu lesen... [2] Shell-Metazeichen im uebergebenen Pfad z.B. -- und diese bei uebergabe auch noch gequoted, also z.B. sowas: dvd_authoren.sh '*' '/blubb/*' [3] z.B. das 'test x || y'-Idiom statt 'if [ x ]; then y; fi' [4] z.B. dass awk selber greppen kann -- Bei Deiner alten SuSE war so ein rechteckiges Ding aus totem Baum dabei. Man nennt es Handbuch. [Stefan Tomaneck in de.comp.os.unix.linux]
participants (2)
-
Al Bogner
-
David Haller