Backup Skript für mehrere CD's
![](https://seccdn.libravatar.org/avatar/5885cb5265fd13b2dd5d83027a1fd8d1.jpg?s=120&d=mm&r=g)
Hallo Liste, Mal zur Abwechslung keine Frage :) anbei ein Skript das ein Übergrosses Verzeichniss mit X Unterverzeichnissen auf möglichst wenige CD's brennt. Vielleicht kann das ja ausser mir noch jemand gebrauchen. An die Skriptgurus vielleicht die Bitte wenn euch was auffällt das besser/anderst/zusätzlich oder sonst wie gemacht werden sollte bitte bescheid sagen. David, das galt Dir ;) Allen anderen viel Spass damit. Greetings Daniel #!/bin/bash # Skript um ein Verzeichnis >> 700MB mit vielen Unterverzeichnissen # < 700MB # auf CD's zu schreiben. CD's sind 1 zu 1 lesbar und enthalten # Listen mit dem Inhalt der anderen CD's # VERZEICHNIS="/mnt/server/software" # zu sicherndes Verzeichnis ISO9660="/mnt/backup/backup.iso" # 700MB müssen frei sein PATHLIST="/tmp/cdrom" # X.txt wird angehängt LOG="/dev/null" # /dev/null für kein Log CDSIZE="700000000" # in Byte CDRW="yes" # werden CD-RW verwendet? # # Programme definieren: (wird noch statisch) # MKISOFS=`which mkisofs` MKI_OPT=" -nobak -l -o $ISO9660 --path-list " CDRECORD=`which cdrecord` CDR_OPT=" -v -eject dev=0,0,0 speed=4 " # ######## AB HIER SOLLTEN KEINE ÄNDERUNGEN MEHR NÖTIG SEIN ####### # # Hier wird aufgeräumt function cleanup () { rm -f "$ISO9660" for each in 0 1 2 3 4 5 6 7 8 9 do rm -f "$PATHLIST".$each.txt done } # # Script soll als root ausgeführt werden # if [ $USER != root ] then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi # # Sicherheitsvorkehrungen # cleanup # # Liste mit Pfaden erstellen und prüfen, dass 700MB nicht # überschritten # werden. # SIZE=0 num=1 # cd "$VERZEICHNIS" for dir in * do let SIZE=$[SIZE+`du -sb "$dir" | cut -f 1`] if test $SIZE -lt $CDSIZE then if test 0 -lt $SIZE then echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt else SIZE=0 let num=$[num+1] echo "Überlauf --> nächste CD" echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt fi else SIZE=0 echo "CD $num voll --> nächste CD" let num=$[num+1] echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt fi done # # IMAGES der Reihe nach erstellen und auf CD brennen. # cd "$VERZEICHNIS" # Nur für den Fall .... i=1; for each in $PATHLIST.?.txt do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi if test $CDRW = "yes" then echo -en "CD-RW wird gelöscht" if $CDRECORD $CDR_OPT blank=fast > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi else echo "Die CD wird nicht gelöscht da CDRW != yes" fi echo -en "CD wird gebrannt " if $CDRECORD $CDR_OPT -data $ISO9660 > $LOG 2>&1 then echo " OK" echo "CD $i bitte wechseln und RETURN drücken" let i=$[i+1] read JUNK else echo " Failed" echo "Der Brennvorgang war nicht erfolgreich" echo "Das Programm wird beendet" cleanup exit -1 fi done # # Aufräumen # cleanup # EOF -- "Niemand hat mich gefragt, ob ich geboren werden will!" jetzt seht ihr was ihr davon habt.
![](https://seccdn.libravatar.org/avatar/735ea797d876adb026ae955e8adbf597.jpg?s=120&d=mm&r=g)
Am Mittwoch, 24. September 2003 00:44 schrieb Daniel Lord:
anbei ein Skript das ein Übergrosses Verzeichniss mit X Unterverzeichnissen auf möglichst wenige CD's brennt. Vielleicht kann das ja ausser mir noch jemand gebrauchen.
An die Skriptgurus vielleicht die Bitte wenn euch was auffällt das besser/anderst/zusätzlich oder sonst wie gemacht werden sollte bitte bescheid sagen.
David, das galt Dir ;)
Der bin ich zwar nicht, aber trotzdem einige Anmerkungen.
#!/bin/bash # Skript um ein Verzeichnis >> 700MB mit vielen Unterverzeichnissen # < 700MB # auf CD's zu schreiben. CD's sind 1 zu 1 lesbar und enthalten # Listen mit dem Inhalt der anderen CD's # VERZEICHNIS="/mnt/server/software" # zu sicherndes Verzeichnis ISO9660="/mnt/backup/backup.iso" # 700MB müssen frei sein PATHLIST="/tmp/cdrom" # X.txt wird angehängt LOG="/dev/null" # /dev/null für kein Log CDSIZE="700000000" # in Byte CDRW="yes" # werden CD-RW verwendet? # # Programme definieren: (wird noch statisch) # MKISOFS=`which mkisofs` MKI_OPT=" -nobak -l -o $ISO9660 --path-list " CDRECORD=`which cdrecord` CDR_OPT=" -v -eject dev=0,0,0 speed=4 " # ######## AB HIER SOLLTEN KEINE ÄNDERUNGEN MEHR NÖTIG SEIN ####### # # Hier wird aufgeräumt function cleanup () { rm -f "$ISO9660"
for each in 0 1 2 3 4 5 6 7 8 9 do rm -f "$PATHLIST".$each.txt done }
Was passiert, wenn mehr als 10 Listen vorhanden sind? Solltest du hier nicht besser alle zutreffenden Listen loeschen (du arbeitest ja unten immer mit >>)? Der cleanup lässt sich imho besser direkt in die Schleife unten einbauen (ich habe die Stellen mit # cleanup gekennzeichnet).
# # Script soll als root ausgeführt werden # if [ $USER != root ] then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi
Das ist a) falsch und b) unsicher und lässt sich c) leicht austricksen: <schnipp> jan@roland:~> echo $USER jan jan@roland:~> export USER=root jan@roland:~> if test "$USER" = "root"; then
echo "hurra, ich bin root" fi hurra, ich bin root <schnapp> Besser wäre es hier, das Kommando "id -u" zu benutzen (die Rechte hängen eh an der User-ID, nicht am Namen) und if test `id -u` -ne 0; then ... fi aufzurufen.
# # Sicherheitsvorkehrungen # cleanup # # Liste mit Pfaden erstellen und prüfen, dass 700MB nicht # überschritten # werden. # SIZE=0 num=1
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
# cd "$VERZEICHNIS" for dir in *
Fehler bei Pfaden mit Leerzeichen, besser: ls | while read dir; do
do let SIZE=$[SIZE+`du -sb "$dir" | cut -f 1`] if test $SIZE -lt $CDSIZE then if test 0 -lt $SIZE then echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt else SIZE=0
huch? $SIZE müsste hier doch eh 0 sein nach Deiner if-Abfrage oben. Ich kenne keinen Fall, in dem du einen negativen Wert zurückliefert. IMHO ist dieser if-then-else überflüssig.
let num=$[num+1] echo "Überlauf --> nächste CD"
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt fi else SIZE=0 echo "CD $num voll --> nächste CD" let num=$[num+1]
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt
Was machst Du bei einer 701 MB großen Datei / Verzeichnis? Sowas solltest Du zusätzlich abfangen und die Datei mit einer Fehlermeldung verwerfen.
fi done # # IMAGES der Reihe nach erstellen und auf CD brennen. # cd "$VERZEICHNIS" # Nur für den Fall .... i=1; for each in $PATHLIST.?.txt
Fehler bei Pfaden mit Leerzeichen, besser: ls $PATHLIST.?.txt | while read each; do Du begrenzt oben die Anzahl der zu erstellenden Textdateien nicht, hier fragst Du nur 0 - 9 (und evtl. zufälligerweise rumliegende a-z, A-Z,...) ab.
do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi if test $CDRW = "yes" then echo -en "CD-RW wird gelöscht" if $CDRECORD $CDR_OPT blank=fast > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi else echo "Die CD wird nicht gelöscht da CDRW != yes" fi echo -en "CD wird gebrannt " if $CDRECORD $CDR_OPT -data $ISO9660 > $LOG 2>&1 then echo " OK" echo "CD $i bitte wechseln und RETURN drücken" let i=$[i+1] read JUNK else echo " Failed" echo "Der Brennvorgang war nicht erfolgreich" echo "Das Programm wird beendet" cleanup exit -1 fi done # # Aufräumen # cleanup # EOF
Jan
![](https://seccdn.libravatar.org/avatar/5885cb5265fd13b2dd5d83027a1fd8d1.jpg?s=120&d=mm&r=g)
Hallo Jan, On Wed, Sep 24, 2003 at 02:01:01AM +0200, Jan Trippler wrote:
Am Mittwoch, 24. September 2003 00:44 schrieb Daniel Lord:
David, das galt Dir ;)
Der bin ich zwar nicht, aber trotzdem einige Anmerkungen.
Da bin ich Dir sicher nicht böse :)
######## AB HIER SOLLTEN KEINE ÄNDERUNGEN MEHR NÖTIG SEIN ####### # # Hier wird aufgeräumt function cleanup () { rm -f "$ISO9660"
for each in 0 1 2 3 4 5 6 7 8 9 do rm -f "$PATHLIST".$each.txt done }
Was passiert, wenn mehr als 10 Listen vorhanden sind? Solltest du hier nicht besser alle zutreffenden Listen loeschen (du arbeitest ja unten immer mit >>)? Der cleanup lässt sich imho besser direkt in die Schleife unten einbauen (ich habe die Stellen mit # cleanup gekennzeichnet).
Dann ist das Skript IMHO durch ein Bandlaufwerk oder eine DVD zu ersetzen :) Den Fall habe ich deshalb ausgeklammert. Unten aber noch die Abfrage vergessen. Gelöscht habe ich die hier damit ich den sudo lokal root xploit umgehen kann der sich sonst anbietet.
if [ $USER != root ] then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi
Das ist a) falsch und b) unsicher und lässt sich c) leicht austricksen: <schnipp> jan@roland:~> echo $USER jan jan@roland:~> export USER=root jan@roland:~> if test "$USER" = "root"; then
echo "hurra, ich bin root" fi hurra, ich bin root <schnapp> Besser wäre es hier, das Kommando "id -u" zu benutzen (die Rechte hängen eh an der User-ID, nicht am Namen) und if test `id -u` -ne 0; then ... fi aufzurufen.
OK, es nützt dem Trickser zwar IMHO nichts aber das wird auf jeden Fall in Zukunft über id geregelt.
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
siehe oben. Das ermöglicht es sudo auszutricksen und r00t zu werden.
ls | while read dir; do
do let SIZE=$[SIZE+`du -sb "$dir" | cut -f 1`] if test $SIZE -lt $CDSIZE then if test 0 -lt $SIZE then echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt else SIZE=0
huch? $SIZE müsste hier doch eh 0 sein nach Deiner if-Abfrage oben. Ich kenne keinen Fall, in dem du einen negativen Wert zurückliefert. IMHO ist dieser if-then-else überflüssig.
Size wird dann negativ wenn die Zahl zu gross wird. Deshalb die zusätzliche Abfrage für den Grenzfall (hatte ich leider schon)
Was machst Du bei einer 701 MB großen Datei / Verzeichnis? Sowas solltest Du zusätzlich abfangen und die Datei mit einer Fehlermeldung verwerfen.
jup das fehlt noch :)
Fehler bei Pfaden mit Leerzeichen, besser: ls $PATHLIST.?.txt | while read each; do
und dabei war ich mir fast sicher das ich überall auch an Leerzeichen gedacht hatte :(
Du begrenzt oben die Anzahl der zu erstellenden Textdateien nicht, hier fragst Du nur 0 - 9 (und evtl. zufälligerweise rumliegende a-z, A-Z,...) ab.
jup, da fehlt noch die Begrenzung.
Jan
Danke für die prompte und produktive Antwort Greetings Daniel -- Darkness is falling, over my mind | http://www.againsttcpa.com/ My burning eyes are, deadly blind | http://www.notcpa.org/ Now there is nothing like it seem | http://chaosradio.ccc.de/cr78.html All illusion, only dreams........ --- Darkwell "Realm Of Darkness"
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Wed, 24 Sep 2003, Daniel Lord schrieb:
Mal zur Abwechslung keine Frage :)
anbei ein Skript das ein Übergrosses Verzeichniss mit X Unterverzeichnissen auf möglichst wenige CD's brennt. Vielleicht kann das ja ausser mir noch jemand gebrauchen.
An die Skriptgurus vielleicht die Bitte wenn euch was auffällt das besser/anderst/zusätzlich oder sonst wie gemacht werden sollte bitte bescheid sagen.
David, das galt Dir ;)
*och menno* Naja, wenn du mich als "scriptguru" bezeichnest fuehle ich mich mal geschmeichelt und verzeihe dir ;)
Allen anderen viel Spass damit.
Greetings Daniel
#!/bin/bash # Skript um ein Verzeichnis >> 700MB mit vielen Unterverzeichnissen # < 700MB # auf CD's zu schreiben. CD's sind 1 zu 1 lesbar und enthalten # Listen mit dem Inhalt der anderen CD's # VERZEICHNIS="/mnt/server/software" # zu sicherndes Verzeichnis ISO9660="/mnt/backup/backup.iso" # 700MB müssen frei sein
Den Variablennamen finde ich eher ungluecklich... beim Weiterlesen hat mich der irritiert... Besser waere IMO z.B.: ISO_IMAGE, IMAGEFILE, IMAGENAME oder aehnliches...
PATHLIST="/tmp/cdrom" # X.txt wird angehängt LOG="/dev/null" # /dev/null für kein Log CDSIZE="700000000" # in Byte
ggfs. an Rohling-Groesse anpassen...
CDRW="yes" # werden CD-RW verwendet?
Koennte man ggfs. noch als Argument bzw. Umgebungsvariable implementieren: : "${CDRW:=yes}"
# # Programme definieren: (wird noch statisch) # MKISOFS=`which mkisofs`
Quoten! MKISOFS="`which mkisofs`" ^ ^ Installier dir mkisofs mal in "~/eigene\ programme/bin/" und setz dieses Verz. in $PATH... *veg*
MKI_OPT=" -nobak -l -o $ISO9660 --path-list "
Da sollte unbedingt noch ein '-r' mit dazu... (evtl. auch nur ein -R und oder ein -J). Da muss man aber ggfs. mit der Groesse des Images aufpassen.
CDRECORD=`which cdrecord`
Quoten! (s.o.)
CDR_OPT=" -v -eject dev=0,0,0 speed=4 " # ######## AB HIER SOLLTEN KEINE ÄNDERUNGEN MEHR NÖTIG SEIN ####### # # Hier wird aufgeräumt function cleanup () { rm -f "$ISO9660"
for each in 0 1 2 3 4 5 6 7 8 9
for i in `seq 0 9` Das greift aber auch "zu kurz" s.u.
do rm -f "$PATHLIST".$each.txt done } # # Script soll als root ausgeführt werden # if [ $USER != root ]
if test $UID -ne 0
then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi
Warum? Darf der User das script nicht verwenden?
# # Sicherheitsvorkehrungen # cleanup # # Liste mit Pfaden erstellen und prüfen, dass 700MB nicht # überschritten # werden. # SIZE=0 num=1 # cd "$VERZEICHNIS" for dir in *
Hier findest du auch Dateien! for dir in `find . -type d -maxdepth 1`
do let SIZE=$[SIZE+`du -sb "$dir" | cut -f 1`] if test $SIZE -lt $CDSIZE then if test 0 -lt $SIZE then echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt
Komisches Quoting das. IMO besser: echo "${VERZEICHNIS}/${dir}" >> "${PATHLIST}.${num}.txt" Durch ${} statt $ werden die Variablennamen eindeutig (man achte auf das andere Quoten).
else SIZE=0 let num=$[num+1] echo "Überlauf --> nächste CD" echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt
dito.
fi else SIZE=0 echo "CD $num voll --> nächste CD" let num=$[num+1] echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt
dito.
fi done # # IMAGES der Reihe nach erstellen und auf CD brennen. # cd "$VERZEICHNIS" # Nur für den Fall .... i=1; for each in $PATHLIST.?.txt
EBADVARNAME! Und scheitert wenn du mehr als 10 Images brauchst! Kurz: du solltest fuer PATHLIST 2 Variablen verwenden! Eine fuer's Verzeichnis, eine fuer den "basename" der Listen: PATHLIST_DIR="/tmp" PATHLIST_FILES="cdrom" die Verwendungen von $PATHLIST weiter oben sind entsprechend anzupassen! Dann: find ${PATHLIST_DIR} -name "${PATHLIST_FILE}.*.txt" | while read file
do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1
Hier bringst du dann IMO was durcheinander!! Wg. des Variablennamens? So schreibst du nur die N Dateien $PATHLIST.?.txt auf die CD! Du meist evtl. sowas: find ${PATHLIST_DIR} -name "${PATHLIST_FILE}.*.txt" | while read file if $MKISOFS $MKI_OPT `cat "$file"`
then echo " OK" else echo " Failed" cleanup exit -1 fi if test $CDRW = "yes"
Quoten! Mach das mal nach nem 'unset CDRW'... if test "x${CDRW}" = "xyes"
then echo -en "CD-RW wird gelöscht" if $CDRECORD $CDR_OPT blank=fast > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi else echo "Die CD wird nicht gelöscht da CDRW != yes" fi echo -en "CD wird gebrannt " if $CDRECORD $CDR_OPT -data $ISO9660 > $LOG 2>&1
Muss natuerlich auch angepasst werden.
then echo " OK" echo "CD $i bitte wechseln und RETURN drücken" let i=$[i+1] read JUNK
EBADVARNAME! Besser: 'read answer', 'read foo', 'read x', 'read ignored', 'read dummy' -- oder auch 'read junk'... Die Grossschreibung aber suggeriert eine Konstante (und eine solche waere wohl wichtig)...
else echo " Failed" echo "Der Brennvorgang war nicht erfolgreich" echo "Das Programm wird beendet" cleanup exit -1 fi done # # Aufräumen # cleanup # EOF
Noch "stilistisches": du rueckst nur minimal ein, was das lesen erschwert. Ausserdem verwendest du ueberlange if Befehl then viel echos else nochmehr echos fi Bloecke, die die eigentliche "Arbeit" verdecken. Da ist IMO eine Funktion "error" oder sonst was sinnvoll, so dass die Fehlerbehandlung nicht alles verdeckt... Ansonsten ist das script nicht schlecht :) -dnh PS: du hast es ja so gewollt ;) -- "The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny ...'" -- Isaac Asimov
![](https://seccdn.libravatar.org/avatar/5885cb5265fd13b2dd5d83027a1fd8d1.jpg?s=120&d=mm&r=g)
Hallo David, On Wed, Sep 24, 2003 at 04:03:40AM +0200, David Haller wrote:
Am Wed, 24 Sep 2003, Daniel Lord schrieb: if test $UID -ne 0
then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi
bis hier hin erst mal ACK
Warum? Darf der User das script nicht verwenden?
Um unötige Fehlermeldungen zu vermeiden. Cdrecord mkisofs etc. sind aus Sicherheitsgründen ohne SUID root installiert. D.h. der user kann das Script nicht verwenden. Oder braucht halt ein sudo davor.
Hier findest du auch Dateien!
for dir in `find . -type d -maxdepth 1`
Dann muss ich ja das Verzeichnis noch aufräumen :)
for each in $PATHLIST.?.txt
EBADVARNAME! ^^^^^^^^^^^^^ was ist das denn?
Und scheitert wenn du mehr als 10 Images brauchst!
jup, fehlt noch eine Abfrage sollte nur für 10 Images gehen. Danach lohnt sich DVD oder besser Band Sicherung ;)
do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1
Hier bringst du dann IMO was durcheinander!! Wg. des Variablennamens?
Nein, die Kommandozeile sieht ohne Variablen dann wie folgt aus. (erster Durchlauf) mkisofs -nobak -l -o /mnt/backup/backup.iso --path-list \ /tmp/cdrom.1.txt /tmp/cdrom.?.txt d.h. mkisofs holt sich aus dem aktuellen Inhaltsverzeichnis die zu brennenden Daten und packt _zusätzlich_ noch die Inhaltsverzeichnisse aller CD's mit drauf.
find ${PATHLIST_DIR} -name "${PATHLIST_FILE}.*.txt" | while read file if $MKISOFS $MKI_OPT `cat "$file"`
sieht kompliziert aus :)
-dnh
PS: du hast es ja so gewollt ;)
Dank Dir für die Mühe David. Werde das jetzt mal mit Jan's Verbesserungsvorschlägen kombinieren und wenn dann jemand das korrigierte Skript brauchen kann schicke ich im das gerne per PM oder wollt Ihr es nochmal auf der Liste :) Greetings Daniel -- and I find it kind of funny I find it kind of sad the dreams in which I'm dying are the best I've ever had. -- Gary Jules-Mad World
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Wed, 24 Sep 2003, Daniel Lord schrieb:
On Wed, Sep 24, 2003 at 04:03:40AM +0200, David Haller wrote:
Am Wed, 24 Sep 2003, Daniel Lord schrieb: [test ob uid = 0] Warum? Darf der User das script nicht verwenden?
Um unötige Fehlermeldungen zu vermeiden. Cdrecord mkisofs etc. sind aus Sicherheitsgründen ohne SUID root installiert. D.h. der user kann das Script nicht verwenden. Oder braucht halt ein sudo davor.
Achso :) Hm. Dann ist der einfache Test mit $UID ok. Ansonsten haette ich eher die Ausgabe von 'id' verwendet... Z.B. so: eval "`/usr/bin/id | cut -d'(' -f1`" test $uid -eq 0 || exit 1 So muesste der User schon /usr/bin/id austauschen, was er nicht darf. Das setzt die Huerde schon hoeher, denn $UID / $USER lassen sich ja einfach manipulieren.
Hier findest du auch Dateien!
for dir in `find . -type d -maxdepth 1`
Dann muss ich ja das Verzeichnis noch aufräumen :)
Du armer :)
for each in $PATHLIST.?.txt
EBADVARNAME! ^^^^^^^^^^^^^ was ist das denn?
man errno ;) E = Error, BADVARNAME = schlechter Variablenname. Ich bezog mich dabei uebrigens auf das 'each'.
Und scheitert wenn du mehr als 10 Images brauchst!
jup, fehlt noch eine Abfrage sollte nur für 10 Images gehen. Danach lohnt sich DVD oder besser Band Sicherung ;)
Ok. Das kannst du selber einbauen?
do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1
Hier bringst du dann IMO was durcheinander!! Wg. des Variablennamens?
Nein, die Kommandozeile sieht ohne Variablen dann wie folgt aus. (erster Durchlauf)
mkisofs -nobak -l -o /mnt/backup/backup.iso --path-list \ /tmp/cdrom.1.txt /tmp/cdrom.?.txt
d.h. mkisofs holt sich aus dem aktuellen Inhaltsverzeichnis die zu brennenden Daten und packt _zusätzlich_ noch die Inhaltsverzeichnisse aller CD's mit drauf.
Achso! $ mkisofs --path-list 2>&1 | head -1 mkisofs: unrecognized option `--path-list' $ strings `which mkisofs` | grep '^mkisofs ' mkisofs 1.12b5 Deshalb! Wenn das --path-list das macht, was ich vermute und deine Verwendung nahelegt, dann...
find ${PATHLIST_DIR} -name "${PATHLIST_FILE}.*.txt" | while read file if $MKISOFS $MKI_OPT `cat "$file"`
... solltest du also besser: find ${PATHLIST_DIR} -name "${PATHLIST_FILE}.*.txt" | while read file do if $MKISOFS $MKI_OPT --path-list "$file" $file verwenden. Ok, wenn du dich auf die 10 Images beschraenkst, dann ist folgendes auch ok: for file in ${PATHLIST_FILE}.[0-9].txt do if $MKISOFS ... Das ? erwischt evtl. zu viel. Oder du nimmst wieder dein `seq 0 9` her und testest, ob "${PATHLIST_FILE}.${i}.txt" existiert: for i in `seq 0 9` do if test -s "${PATHLIST_FILE}.${i}.txt" then if $MKISOFS ... fi rm -f "${PATHLIST_FILE}.${i}.txt" else ... fi done Aeh, da faellt mir noch was ein: du solltest evtl. die Dateilisten besser nicht unter /tmp/ ablegen, besser ist vielleicht: PATHLIST_DIR="`mktemp -d \"/tmp/cdrombackup.$$.XXXXXX\"`" PATHLIST_NAME="${PATHLIST_DIR}/pathlist" Dann: find "$VERZEICHNIS" -type d -maxdepth 1 | while read dir do let SIZE ... ... echo "$dir" >> "${PATHLIST_NAME}.${i}.txt" # [...] done Mit 'find' sparst du dir auch gleich noch das cd ;) Am Schluss und wenn alles geklappt hat, machst du dann nur noch ein 'rm -rf "$PATHLIST_DIR"' ;)
sieht kompliziert aus :)
Isses doch aber gar net ;)
-dnh
PS: du hast es ja so gewollt ;)
Dank Dir für die Mühe David. Werde das jetzt mal mit Jan's Verbesserungsvorschlägen kombinieren und wenn dann jemand das korrigierte Skript brauchen kann schicke ich im das gerne per PM oder wollt Ihr es nochmal auf der Liste :)
Ja, bitte. Ich wuerde das gerne nochmal im Zusammenhang sehen ;) Wohin du's mailst ist mir egal ;) -dnh PS: mir fiel noch auf, dass du 'let' ungewoehnlich verwendest: $ ( num=1; echo -n $num; num=$[num+1]; echo -n $num; num=$((num+1)); echo -n $num; let num=$num+1; echo -n $num; let num+=1; echo -n $num; let num=$[num+1]; echo $num; ) 123456 Such dir was aus ;) Allerdings ist $[] nicht portabel und funktioniert z.B. in der ksh nicht. $(( )) ist POSIX konform und tut in der ksh. 'let' auch. -- Some days it just doesn't pay to get out of bed long enough to hit the snooze button. -- Eric The Read in asr
![](https://seccdn.libravatar.org/avatar/5885cb5265fd13b2dd5d83027a1fd8d1.jpg?s=120&d=mm&r=g)
Hallo Jan, David, Liste :) On Thu, Sep 25, 2003 at 07:07:53PM +0200, David Haller wrote:
korrigierte Skript brauchen kann schicke ich im das gerne per PM oder wollt Ihr es nochmal auf der Liste :)
Ja, bitte. Ich wuerde das gerne nochmal im Zusammenhang sehen ;) Wohin du's mailst ist mir egal ;)
Biddeee ... im Zusammenhang. Ich hoffe es finden sich jetzt keine gravierenden Fehler mehr. ;) Bei mir ist es auf jeden Fall schon im Einsatz. Das einzige was mich noch etwas stört ist, dass mkisofs Die Grundverzeichnisse nicht mitsichert :( Damit meine Zeilenumbrüche etc. so bleiben wie sie sind diesmal als Base64. Achso, alle die das nicht im Kopf dekodiern können/wollen :) mimencode -u <file> _oder_ uudecode <file> Zur Ausführung wird ein mkisofs benötigt das --path-list unterstützt. Bei mir ist das mkisofs 2.0.3. Greetings Daniel begin-base64 644 - IyEvYmluL2Jhc2gKIyBTY3JpcHQgdW0gZWluIFZlcnplaWNobmlzID4+IDcw ME1CIG1pdCB2aWVsZW4gVW50ZXJ2ZXJ6ZWljaG5pc3NlbiA8IDcwME1CCiMg YXVmIENEJ3MgenUgc2NocmVpYmVuLiBDRCdzIHNpbmQgMSB6dSAxIGxlc2Jh ciB1bmQgZW50aGFsdGVuIExpc3RlbiBtaXQKIyBkZW0gSW5oYWx0IGRlciBh bmRlcmVuIENEJ3MKIwpWRVJaRUlDSE5JUz0iL21udC9zZXJ2ZXIvc29mdHdh cmUiICAgICMgCklTT19JTUFHRT0iL21udC9iYWNrdXAvYmFja3VwLmlzbyIg ICAgIwpMT0c9Ii90bXAvbnVsbCIgICAgICAgICAgICAgICAgICAgICAgICMg L2Rldi9udWxsIGb8ciBrZWluIExvZwpDRFNJWkU9IjcwMDAwMDAwMCIgICAg ICAgICAgICAgICAgICAgICMgaW4gQnl0ZQpDRFJXPSJ5ZXMiICAgICAgICAg ICAgICAgICAgICAgICAgICAgICMgd2VyZGVuIENELVJXIHZlcndlbmRldD8K UEFUSExJU1Q9Ii90bXAvYmt1cF9za3JpcHQvY2Ryb20iICAgICAjIFgudHh0 IHdpcmQgYW5nZWjkbmd0CiMgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eIGRp ZXNlcyBWZXJ6ZWljaG5pcyB3aXJkIHNw5HRlciBnZWz2c2NodC4KIyBVbmQg YmVpIGJlZGFyZiAoU2NyaXB0YW5mYW5nKSBuZXUgZXJzdGVsbHQuCiMKIyBQ cm9ncmFtbWUgZGVmaW5pZXJlbjogKHdpcmQgbm9jaCBzdGF0aXNjaCkKTUtJ U09GUz0iYHdoaWNoIG1raXNvZnNgIgpNS0lfT1BUPSIgLW5vYmFrIC1sIC1v ICRJU09fSU1BR0UgLS1wYXRoLWxpc3QgIgojIE1LSV9PUFQ9Ii1ub2JhayAt ciAtbCAtbyAkSVNPX0lNQUdFIC0tcGF0aC1saXN0IiNGZWhsZXIgZG9wcGVs dC4gRGF0ZWluYW1lbgpDRFJFQ09SRD0iYHdoaWNoIGNkcmVjb3JkYCIKQ0RS X09QVD0iIC12IC1lamVjdCBkZXY9MCwwLDAgc3BlZWQ9MTAgIgojCiMgREVC VUcgZ2lidCBhYmVyIHppZW1saWNoIHZpZWwgb3V0cHV0IDopCiNzZXQgLXgK IyMjIyMjIyMjIyAgQUIgSElFUiBTT0xMVEVOIEtFSU5FIMROREVSVU5HRU4g TUVIUiBO1lRJRyBTRUlOICMjIyMjIyMjIyMjIyMjIyMKIwojIEhpZXIgd2ly ZCBhdWZnZXLkdW10CmZ1bmN0aW9uIGNsZWFudXAgKCkKewogICAgcm0gLWYg IiRJU09fSU1BR0UiCiAgICBybSAtUmYgImBkaXJuYW1lICR7UEFUSExJU1R9 YCIKfQojIEZlaGxlcmJlaGFuZGx1bmcgYXVzIGRlbSBTa3JpcHQgbmVobWVu CmZ1bmN0aW9uIGVycm9yICgpCnsKICAgIGVjaG8gIiAgIEZhaWxlZCIKICAg IGNsZWFudXAKICAgIGV4aXQgLTEKfQojIE5hIGd1dCwgZGFzIGlzdCB2aWVs bGVpY2h0IPxiZXJ0cmllYmVuIC4uLi4KZnVuY3Rpb24gb2sgKCkKewogICAg ZWNobyAiICAgT0siCn0KIyAKZnVuY3Rpb24gZGlza2Vycm9yICgpCnsKICAg IGVjaG8gIiIKICAgIGVjaG8gIiBFcyBpc3QgYW4gZGVyIFplaXQgc2ljaCBl aW4gRFZELVJXL0JhbmQgTGF1ZndlcmsgenUga2F1ZmVuLiIKICAgIGVjaG8g IiBVc2FjaGU6IgogICAgZWNobyAiIGEpIHp1IHZpZWxlIERhdGVuICA+IDEw IHggJHtDRFNJWkV9IgogICAgZWNobyAiIGIpIGVpbiBWZXJ6ZWljaG5pcyA+ ICR7Q0RTSVpFfSIKICAgIGVjaG8gIiIKfQojCiMgU2NyaXB0IHNvbGwgYWxz IHJvb3QgYXVzZ2Vm/GhydCB3ZXJkZW4KIwppZiB0ZXN0IGBpZCAtdWAgLW5l IDA7CnRoZW4KICAgIGVjaG8gIiBQcm9ncmFtbSBtdXNzIGFscyBCZW51dHpl ciBcInJvb3RcIiBhdXNnZWb8aHJ0IHdlcmRlbi4iCiAgICBleGl0IC0xCmZp CiMKIyBTaWNoZXJoZWl0c3ZvcmtlaHJ1bmdlbgogY2xlYW51cAojCiMgVGVt cG9y5HJlcyBWZXJ6ZWljaG5pcyBlcnN0ZWxsZW4KbWtkaXIgYGRpcm5hbWUg JHtQQVRITElTVH1gCiMKIyBMaXN0ZSBtaXQgUGZhZGVuIGVyc3RlbGxlbiB1 bmQgcHL8ZmVuLCBkYXNzIDcwME1CIG5pY2h0IPxiZXJzY2hyaXR0ZW4gCiMg d2VyZGVuLiAKIwpTSVpFPTAKbnVtPTAKY2QgJHtWRVJaRUlDSE5JU30KbHMg fCB3aGlsZSByZWFkIERJUgojCmRvCiAgIERVU0laRT1gZHUgLXNiICIke0RJ Un0iIHwgY3V0IC1mIDFgCiMKICAgaWYgdGVzdCAke0RVU0laRX0gLWd0ICR7 Q0RTSVpFfQogICB0aGVuCiAgICAgIGRpc2tlcnJvcgogICAgICBlY2hvICIg VmVyemVpY2huaXMgJERJUiB3dXJkZSBuaWNodCBnZXNpY2hlcnQhISEiCiAg IGVsc2UKIwogICAgICBTSVpFPSQoKFNJWkUrJHtEVVNJWkV9KSkKIwogICAg ICBpZiB0ZXN0ICR7U0laRX0gLWx0ICR7Q0RTSVpFfQogICAgICAgICB0aGVu CiMKICAgICAgICAgICAgIGlmIHRlc3QgMCAtbHQgJHtTSVpFfQogICAgICAg ICAgICAgdGhlbgogICAgICAgICAgICAgICAgICAgZWNobyAiJHtWRVJaRUlD SE5JU30vJHtESVJ9IiA+PiAiJHtQQVRITElTVH0uJHtudW19LnR4dCIKICAg ICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgIFNJWkU9MAogICAg ICAgICAgICAgICAgICAgZWNobyAiINxiZXJsYXVmICAtLT4gbuRjaHN0ZSBD RCIKICAgICAgICAgICAgICAgICAgIG51bT0kKChudW0rMSkpCiAgICAgICAg ICAgICAgICAgICBlY2hvICIke1ZFUlpFSUNITklTfS8ke0RJUn0iID4+ICIk e1BBVEhMSVNUfS4ke251bX0udHh0IgogICAgICAgICAgICAgZmkKIwogICAg ICAgICBlbHNlCiAgICAgIAkgICAgIFNJWkU9MAogICAgICAgICAgICAgZWNo byAiIENEICRudW0gdm9sbCAtLT4gbuRjaHN0ZSBDRCIKICAgICAgICAgICAg IG51bT0kKChudW0rMSkpCiAgICAgICAgICAgICBlY2hvICIke1ZFUlpFSUNI TklTfS8ke0RJUn0iID4+ICIke1BBVEhMSVNUfS4ke251bX0udHh0IgogICAg ICAgICBmaQojCiAgICAgICAgIGlmIHRlc3QgJHtudW19IC1ndCA5ICAgIyBB YiAxMCBDRCdzIHdpcmQgZXMgbORzdGlnLgogICAgICAgICB0aGVuCiAgICAg ICAgICAgICAgZGlza19lcnJvcgogICAgICAgICAgICAgIGNsZWFudXAKICAg ICAgICAgZXhpdCAtMQogICAgICAgICBmaQogICBmaQojCmRvbmUKIwplY2hv ICIgU28sIGpldHp0IGhhYmVuIHdpciBhdWNoIG5vY2ggZGllIGxldHp0ZSBD RCA6KSIKIwojIElNQUdFUyBkZXIgUmVpaGUgbmFjaCBlcnN0ZWxsZW4gdW5k IGF1ZiBDRCBicmVubmVuLgojIApjZCAiJHtWRVJaRUlDSE5JU30iICAgICAg ICAgICAgICMgTnVyIGb8ciBkZW4gRmFsbCAuLi4uCmk9MDsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIyBa5GhsZXIgc2V0emVuCiMKIyBLbGVpbmVy ICJTY2htdXR6Z3JpZmYiIHZlcm1laWRldCBlaW5lIEZlaGxlcm1lbGR1bmcg YmVpIG1raXNvZiAKIyB3ZWdlbiBuaWNodGV4aXN0ZW50ZXIgRGF0ZWllbiB1 bmQgYmVzY2hy5G5rdCBkaWUgTGlzdGVuIHRyb3R6ZGVtIGF1ZgojIDEwIC4u LiB1bmQgaWNoIHZlcnN0ZWhlIHdhcyBpY2ggbWFjaGUgOykKdG91Y2ggJHtQ QVRITElTVH0uezAsMSwyLDMsNCw1LDYsNyw4LDl9LnR4dAojCmVjaG8gIiBC aXR0ZSBDRCAwIGVpbmxlZ2VuIHVuZCBSRVRVUk4gZHL8Y2tlbiIKcmVhZCBq dW5rCiMKZm9yIERJUl9MSVNUIGluICR7UEFUSExJU1R9LlswLTldLnR4dApk bwogICBlY2hvIC1lbiAiIElTTyBJbWFnZSB3aXJkIGVyc3RlbGx0LiIKICAg aWYgJHtNS0lTT0ZTfSAke01LSV9PUFR9ICR7RElSX0xJU1R9ICR7UEFUSExJ U1R9LlswLTldLnR4dCA+ICR7TE9HfSAyPiYxCiAgIHRoZW4KICAgICAgICBv awogICBlbHNlCiAgICAgICAgZXJyb3IKICAgZmkKIwogICBpZiB0ZXN0IHgk e0NEUld9ID0gInh5ZXMiCiAgIHRoZW4KICAgICAgIGVjaG8gLWVuICIgQ0Qt Ulcgd2lyZCBzY2huZWxsIGdlbPZzY2h0IgojICAgICAKICAgICAgIGlmICR7 Q0RSRUNPUkR9ICR7Q0RSX09QVH0gYmxhbms9ZmFzdCA+ICR7TE9HfSAyPiYx CiAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICBvawogICAgICAgICAg IGVsc2UKIwkgICBNZWluIEJyZW5uZXIgbWFjaHQgZGEgYWIgdW5kIGFuIFBy b2JsZW1lIGJlaW0gc2NobmVsbGVuIGz2c2NoZW4uCgkgICBlY2hvICIgICBG YWlsZWQiCgkgICBlY2hvIC1lbiAiIENEUlcgd2lyZCB2b2xsc3TkbmRpZyBn ZWz2c2NodC4iCgkgICBpZiAke0NEUkVDT1JEfSAke0NEUl9PUFR9IGJsYW5r PWFsbCA+ICR7TE9HfSAyPiYxCgkgICB0aGVuCgkgICAgICAgb2sKCSAgIGVs c2UKICAgICAgICAgICAgICAgZXJyb3IKCSAgIGZpCiAgICAgICBmaQojICAg ICAgIAogICBlbHNlCiAgICAgICAgZWNobyAiIERpZSBDRCB3aXJkIG5pY2h0 IGdlbPZzY2h0IGRhIENEUlcgIT0geWVzIgogICBmaQojCiAgIGVjaG8gLWVu ICIgQ0Qgd2lyZCBnZWJyYW5udCAgICAgICAgICIKIyBKZXR6dCB3aXJkIGVz IGhlaXNzIDopCiAgIGlmICR7Q0RSRUNPUkR9ICR7Q0RSX09QVH0gLWRhdGEg JHtJU09fSU1BR0V9ID4gJHtMT0d9IDI+JjEKICAgdGhlbgogICAgICAgb2sK ICAgICAgIGVjaG8gIiBDRCAkaSBiaXR0ZSB3ZWNoc2VsbiB1bmQgUkVUVVJO IGRy/GNrZW4iCiAgICAgICBpPSQoKGkrMSkpCiAgICAgICByZWFkIGp1bmsK ICAgZWxzZQogICAgICAgZXJyb3IKICAgZmkKIwpkb25lCiMKIyBBdWZy5HVt ZW4KIwogY2xlYW51cAojIEVPRgo= ==== -- Laugh about your problems, everyone else does.
![](https://seccdn.libravatar.org/avatar/5885cb5265fd13b2dd5d83027a1fd8d1.jpg?s=120&d=mm&r=g)
Hallo, On Thu, Sep 25, 2003 at 11:56:13PM +0200, Daniel Lord wrote:
Biddeee ... im Zusammenhang. Ich hoffe es finden sich jetzt keine gravierenden Fehler mehr. ;) Bei mir ist es auf jeden Fall schon im Einsatz. Das einzige was mich noch etwas stört ist, dass mkisofs Die Grundverzeichnisse nicht mitsichert :(
*gaaag* OK, jetzt noch mal auf deutsch. Ich habe hier gleich mal noch ein paar Änderungen die ich vor dem Abschicken noch eingefügt habe. Wie sich herausstellte war das keine gute Idee. folgendes bitte ändern :( touch ${PATHLIST}.{0,1,2,3,4,5,6,7,8,9}.txt # touch ${PATHLIST}.{0,1,2,3,4,5,6,7,8,9}.txt if ${MKISOFS} ${MKI_OPT} ${DIR_LIST} ${PATHLIST}.[0-9].txt > ${LOG} 2>&1 if ${MKISOFS} ${MKI_OPT} ${DIR_LIST} ${PATHLIST}.?.txt > ${LOG} 2>&1 Sorry Daniel -- Erst nachdem wir alles verloren haben, haben wir die Freiheit alles zu tun.
![](https://seccdn.libravatar.org/avatar/cfb9f39322922893a383c14557b27789.jpg?s=120&d=mm&r=g)
Am Mittwoch, 24. September 2003 04:03 schrieb David Haller:
Hallo,
Hallo, bin seit einiger Zeit auch etwas ähnliches am basteln. ;-) Daher habe ich den Thread mal verfolgt.
Quoten!
MKISOFS="`which mkisofs`" ^ ^ Installier dir mkisofs mal in "~/eigene\ programme/bin/" und setz dieses Verz. in $PATH... *veg*
Ich habe sowas nicht gequotet in meinem Script. Offengestanden habe ich aber bei dem einen oder anderen Fall auch noch meine kleinen Problemchen mit dem Quoten. Deshalb habe ich deinen Fall oben mal ausprobiert: chsch@client2:~> mkdir bin\ dir chsch@client2:~> echo '#!/bin/bash' > bin\ dir/test_script chsch@client2:~> echo 'ls -l ~' >> bin\ dir/test_script chsch@client2:~> chmod u+x bin\ dir/test_script chsch@client2:~> PATH=${PATH}:/home/chsch/bin\ dir/ chsch@client2:~> TEST=`which test_script` chsch@client2:~> echo $TEST /home/chsch/bin dir/test_script Läuft doch alles rund, oder!? Warum sollte man hier dennoch quoten? Danke für Antworten. Tschüs, Christian
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Wed, 24 Sep 2003, Christian Schneider schrieb:
Am Mittwoch, 24. September 2003 04:03 schrieb David Haller: [..]
Quoten!
MKISOFS="`which mkisofs`" ^ ^ Installier dir mkisofs mal in "~/eigene\ programme/bin/" und setz dieses Verz. in $PATH... *veg*
Ich habe sowas nicht gequotet in meinem Script. Offengestanden habe ich aber bei dem einen oder anderen Fall auch noch meine kleinen Problemchen mit dem Quoten. Deshalb habe ich deinen Fall oben mal ausprobiert:
chsch@client2:~> mkdir bin\ dir chsch@client2:~> echo '#!/bin/bash' > bin\ dir/test_script chsch@client2:~> echo 'ls -l ~' >> bin\ dir/test_script chsch@client2:~> chmod u+x bin\ dir/test_script chsch@client2:~> PATH=${PATH}:/home/chsch/bin\ dir/ chsch@client2:~> TEST=`which test_script` chsch@client2:~> echo $TEST /home/chsch/bin dir/test_script
Läuft doch alles rund, oder!?
Warum sollte man hier dennoch quoten?
Und jetzt ruf mal 'test_script' via Variable auf... dh@slarty[3]: /tmp/test4 (0)$ mkdir 'bin dir' dh@slarty[3]: /tmp/test4 (0)$ echo -e '#!/bin/bash\necho "Hallo Welt!"' > bin\ dir/test_script dh@slarty[3]: /tmp/test4 (0)$ chmod u+x bin\ dir/test_script dh@slarty[3]: /tmp/test4 (0)$ PATH=./bin\ dir:${PATH} dh@slarty[3]: /tmp/test4 (0)$ T=`which test_script` dh@slarty[3]: /tmp/test4 (0)$ echo $T ./bin dir/test_script dh@slarty[3]: /tmp/test4 (0)$ $T bash: ./bin: No such file or directory dh@slarty[3]: /tmp/test4 (127)$ Na? Daemmert's? *g* dh@slarty[3]: /tmp/test4 (0)$ T="`which test_script`" dh@slarty[3]: /tmp/test4 (0)$ $T bash: ./bin: No such file or directory dh@slarty[3]: /tmp/test4 (127)$ "$T" Hallo Welt! dh@slarty[3]: /tmp/test4 (0)$ -dnh -- 26: Plug & Play Die Gebrauchsanweisung ist nicht rechtzeitig fertiggeworden. (Peter Berlich)
![](https://seccdn.libravatar.org/avatar/cfb9f39322922893a383c14557b27789.jpg?s=120&d=mm&r=g)
Am Mittwoch, 24. September 2003 15:51 schrieb David Haller:
Hallo,
Am Wed, 24 Sep 2003, Christian Schneider schrieb:
Am Mittwoch, 24. September 2003 04:03 schrieb David Haller:
[..]
Quoten!
MKISOFS="`which mkisofs`" ^ ^ Installier dir mkisofs mal in "~/eigene\ programme/bin/" und setz dieses Verz. in $PATH... *veg*
Ich habe sowas nicht gequotet in meinem Script. Offengestanden habe
^^^^^ War vielleicht etwas ungenau.
ich aber bei dem einen oder anderen Fall auch noch meine kleinen Problemchen mit dem Quoten. Deshalb habe ich deinen Fall oben mal ausprobiert:
chsch@client2:~> mkdir bin\ dir chsch@client2:~> echo '#!/bin/bash' > bin\ dir/test_script chsch@client2:~> echo 'ls -l ~' >> bin\ dir/test_script chsch@client2:~> chmod u+x bin\ dir/test_script chsch@client2:~> PATH=${PATH}:/home/chsch/bin\ dir/ chsch@client2:~> TEST=`which test_script` chsch@client2:~> echo $TEST /home/chsch/bin dir/test_script
Läuft doch alles rund, oder!?
Warum sollte man hier dennoch quoten?
Und jetzt ruf mal 'test_script' via Variable auf...
Hmm, ich glaube hier gab es ein kleines Missverständnis. ;-) Um den Aufruf via Variable ging es mir nicht. Da ist es mir schon klar, dass man quoten muss. Mir ging es viel mehr um die Variablenzuweisung (<- das war das "sowas" aus meiner ersten Mail ;-)) und ob VARIABLE=`blabla` nicht in jedem Fall das Gleiche macht wie VARIABLE="`blabla`". Wie im zweiten Fall zu quoten hast du ganz oben empfohlen und auch in einem anderen, kürzlich gelaufenen Thread (s. auch [1] und [2]). Da ich keinen Unterschied zwischen den beiden Formen finden konnte, habe ich mal nachgefragt. Nicht dass es nachher irgendwelche Fälle gibt, in denen das Script bei der nicht gequoteten Version doch einen Fehler produziert oder zumindest anders reagiert...
dh@slarty[3]: /tmp/test4 (0)$ mkdir 'bin dir' dh@slarty[3]: /tmp/test4 (0)$ echo -e '#!/bin/bash\necho "Hallo Welt!"' > bin\ dir/test_script dh@slarty[3]: /tmp/test4 (0)$ chmod u+x bin\ dir/test_script dh@slarty[3]: /tmp/test4 (0)$ PATH=./bin\ dir:${PATH} dh@slarty[3]: /tmp/test4 (0)$ T=`which test_script`
[1] ^^^^^^^^^^^^^^^^^^^^^
dh@slarty[3]: /tmp/test4 (0)$ echo $T ./bin dir/test_script dh@slarty[3]: /tmp/test4 (0)$ $T bash: ./bin: No such file or directory dh@slarty[3]: /tmp/test4 (127)$
Na? Daemmert's? *g*
dh@slarty[3]: /tmp/test4 (0)$ T="`which test_script`"
[2] ^^^^^^^^^^^^^^^^^^^^^^^
dh@slarty[3]: /tmp/test4 (0)$ $T bash: ./bin: No such file or directory dh@slarty[3]: /tmp/test4 (127)$ "$T" Hallo Welt! dh@slarty[3]: /tmp/test4 (0)$
-dnh
Tschüs, Christian
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Wed, 24 Sep 2003, Christian Schneider schrieb:
Am Mittwoch, 24. September 2003 15:51 schrieb David Haller:
Am Wed, 24 Sep 2003, Christian Schneider schrieb:
ich aber bei dem einen oder anderen Fall auch noch meine kleinen Problemchen mit dem Quoten. [..] Warum sollte man hier dennoch quoten?
Und jetzt ruf mal 'test_script' via Variable auf...
Hmm, ich glaube hier gab es ein kleines Missverständnis. ;-) Um den Aufruf via Variable ging es mir nicht. Da ist es mir schon klar, dass man quoten muss.
Mir ging es viel mehr um die Variablenzuweisung (<- das war das "sowas" aus meiner ersten Mail ;-)) und ob VARIABLE=`blabla` nicht in jedem Fall das Gleiche macht wie VARIABLE="`blabla`". Wie im zweiten Fall zu quoten hast du ganz oben empfohlen und auch in einem anderen, kürzlich gelaufenen Thread (s. auch [1] und [2]).
Da ich keinen Unterschied zwischen den beiden Formen finden konnte, habe ich mal nachgefragt. Nicht dass es nachher irgendwelche Fälle gibt, in denen das Script bei der nicht gequoteten Version doch einen Fehler produziert oder zumindest anders reagiert...
Diese Faelle gibt es, habe ich aber nicht erwaehnt. Ein Beispiel ist IIRC, wenn z.b. '*' vorkommt. Jan und ich haben das mal durchexerziert, leider finde ich den Thread grad nicht... Jedenfalls: foo=`echo $bar | sed 's/x/u'` ## funktioniert nicht foo=`echo "$bar" | sed 's/x/u'` ## funktioniert nicht foo="`echo $bar | sed 's/x/u'`" ## funktioniert nicht foo="`echo \"$bar\" | sed 's/x/u'`" ## funktioniert fast immer Die Faelle, in denen $bar nicht gequotet ist, brechen z.B. bei '*' im Inhalt von $bar, wird nur "innen" das $bar gequotet bricht's an was anderem, was mir aber leider gerade auch nicht mehr einfaellt. Korrekt funktioniert es letztlich nur, wenn "innen" und "aussen" gequotet wird, also wenn foo="`echo \"$bar\" | sed 's/x/u/g'`" verwendet wird. Und auch wenn man "$foo" dann verwendet, quoten! ;) -dnh -- Q: What are the benefits of speaking to your fans via e-mail? A: It's quicker, easier, and involves less licking. -- Douglas N. Adams
participants (4)
-
Christian Schneider
-
Daniel Lord
-
David Haller
-
Jan.Trippler@t-online.de