read aus einer pipe im shellscript
Hi, das ist zum verzweifeln, ich hab hier ein shellscript in dem ich was erweitern möchte, das Problem stellt sich isoliert folgendermassen dar: #!/bin/sh echo DEFANGED.12746 exit #!/bin/sh # set -xv CKSUM="/usr/bin/cksum" CKSUM_OUT=`$CKSUM tf1 tf2` echo $CKSUM_OUT | read VALUE1 SIZE1 NAME1 VALUE2 SIZE2 NAME2 # echo "Cksum = $CKSUM_OUT" echo "Val1 = $VALUE1" echo "Val2 = $VALUE2" echo "Nam1 = $NAME1" echo "Nam2 = $NAME2" echo "Siz1 = $SIZE1" echo "Siz2 = $SIZE2" echo " " wobei tf1 und tf2 beliebige testfiles sind. Das Ergebnis von cksum ist ein string der jew. 3 elemente hat und dazwischen ein newline, die IFS Variable sollte doch per default eigentlich auf space,newline und tab stehen und trotzdem kommt in den Variablen nix an. Kann mir bitte mal jemand das Brett vom Kopf nehmen, Danke. Gruss Falk -- This message has been 'sanitized'. This means that potentially dangerous content has been rewritten or removed. The following log describes which actions were taken. Sanitizer (start="1077554903"): SanitizeFile (filename="unnamed.txt", mimetype="text/plain"): Match (rule="2"): Enforced policy: accept Defanged UNIX shell script(s). Total modifications so far: 1 Anomy 0.0.0 : sanitizer.pl $Id: Sanitizer.pm,v 1.25 2001/09/04 15:49:11 bre Exp $
Am Montag, 23. Februar 2004 17:52 schrieb Falk Sauer:
das ist zum verzweifeln, ich hab hier ein shellscript in dem ich was erweitern möchte, das Problem stellt sich isoliert folgendermassen dar:
#!/bin/sh echo DEFANGED.12746 exit #!/bin/sh # set -xv CKSUM="/usr/bin/cksum" CKSUM_OUT=`$CKSUM tf1 tf2` echo $CKSUM_OUT | read VALUE1 SIZE1 NAME1 VALUE2 SIZE2 NAME2 # echo "Cksum = $CKSUM_OUT" echo "Val1 = $VALUE1" echo "Val2 = $VALUE2" echo "Nam1 = $NAME1" echo "Nam2 = $NAME2" echo "Siz1 = $SIZE1" echo "Siz2 = $SIZE2" echo " "
wobei tf1 und tf2 beliebige testfiles sind.
Das Ergebnis von cksum ist ein string der jew. 3 elemente hat und dazwischen ein newline, die IFS Variable sollte doch per default eigentlich auf space,newline und tab stehen und trotzdem kommt in den Variablen nix an.
man bash ;-)
Das Problem taucht hier regelmäßig auf. Durch Pipes verbundene
Prozesse werden in eigenen Subshells ausgeführt, ergo können die
dort gesetzten Variablen dahinter im Script (weil zurück in der
aufrufenden Shell) nicht ankommen.
Du kannst es so machen:
jan@roland:~/tmp> COUT="`cksum datei do.pl`"
jan@roland:~/tmp> read a b c d e f < `echo $COUT`
EOF
jan@roland:~/tmp> echo $a
233738288
jan@roland:~/tmp> echo $b
254
jan@roland:~/tmp> echo $c
datei
jan@roland:~/tmp> echo $d
3253018791
jan@roland:~/tmp> echo $e
216
jan@roland:~/tmp> echo $f
do.pl Jan
P.S.: Deine Signatur ist etwas lang
Hi Jan, Jan Trippler schrieb:
man bash ;-)
;-) klar
Das Problem taucht hier regelmäßig auf.
wundert mich nicht wirklich s.u.
Durch Pipes verbundene Prozesse werden in eigenen Subshells ausgeführt, ergo können die dort gesetzten Variablen dahinter im Script (weil zurück in der aufrufenden Shell) nicht ankommen.
hm wenn das so ist ist das logisch, gestern hab ich noch ein wenig geschmökert da bin ich just auf genau dieses konstrukt gestossen in einem nicht gerade preiswerten Buch. War das mal anders oder gibt es systeme wo das anders ist? Oder anders gefragt ist dieses Verhalten konfigurierbar?
Du kannst es so machen:
jan@roland:~/tmp> COUT="`cksum datei do.pl`" jan@roland:~/tmp> read a b c d e f <
`echo $COUT` EOF
heiss, mit dem here statement und Variablen hab ich in einem
ähnlichen Fall auch ein paar seltsame Erfahrungen gesammelt
zb:
wenn ich sowas hier bau
laber sülz statement< P.S.: Deine Signatur ist etwas lang sag jetzt nicht das der filter auch rauswärts wirkt, der springt ua.
auf beliebeige bangpath an, wahrscheinlich hat da vor Monaten mal ne
Änderung einen Seiteneffekt produziert. :-(
Gruss
Falk
Am Dienstag, 24. Februar 2004 06:49 schrieb Falk Sauer:
Jan Trippler schrieb: [...]
Durch Pipes verbundene Prozesse werden in eigenen Subshells ausgeführt, ergo können die dort gesetzten Variablen dahinter im Script (weil zurück in der aufrufenden Shell) nicht ankommen.
hm wenn das so ist ist das logisch, gestern hab ich noch ein wenig geschmökert da bin ich just auf genau dieses konstrukt gestossen in einem nicht gerade preiswerten Buch. War das mal anders oder gibt es systeme wo das anders ist? Oder anders gefragt ist dieses Verhalten konfigurierbar?
AFAIK nein - ich kenne kein *nix, wo das anders ist.
Du kannst es so machen:
jan@roland:~/tmp> COUT="`cksum datei do.pl`" jan@roland:~/tmp> read a b c d e f <
`echo $COUT` EOF
heiss, mit dem here statement und Variablen hab ich in einem ähnlichen Fall auch ein paar seltsame Erfahrungen gesammelt
zb:
wenn ich sowas hier bau
laber sülz statement<
wird mir die Variable nicht expandiert, ist das normal?
Ja - guck Dir mal den Unterschied zwischen Deinem und meinem
Statement an - das here-Dokument übernimmt die Rolle von stdin - Du
musst also was ausgeben. Es geht in Deinem Fall übrigens noch
einfacher, Du brauchst den Zwischenschritt über die
Variablenzuweisung nicht:
jan@roland:~/tmp> read a b c d e f < `cksum datei do.pl | tr '\n' ' '`
EOF Der tr deshalb, weil \n als Ende der Eingabe gelten würde.
Jan
Hi Jan, Jan Trippler schrieb:
Am Dienstag, 24. Februar 2004 06:49 schrieb Falk Sauer:
AFAIK nein - ich kenne kein *nix, wo das anders ist.
mann oh mann, Bücher sind auch nicht mehr das was sie mal waren :-/
jan@roland:~/tmp> read a b c d e f <
`cksum datei do.pl | tr '\n' ' '` EOF
Der tr deshalb, weil \n als Ende der Eingabe gelten würde.
wird immer besser ;-) aber trotzdem versteh ich das da oben nicht
gänzlich, wenn eine Variable in einem here Dokument steht müsste sie
doch aber von der shell expandiert werden, da sollte doch dann die
shell die 'Ausgabe' an den here reader machen, das wäre in meinen
Augen logisch und konsistent.
Müsste demnach also mit
statement<
Am Dienstag, 24. Februar 2004 22:37 schrieb Falk Sauer: [...]
Müsste demnach also mit statement<
So gehts doch (und so stand es IIRC auch in meinem ersten Beispiel).
jan@roland:~/tmp> VAR=datei
jan@roland:~/tmp> read x < `echo $VAR`
EOF
jan@roland:~/tmp> echo $x
datei Jan
Hallo Falk, hallo Leute, Am Montag, 23. Februar 2004 17:52 schrieb Falk Sauer:
das ist zum verzweifeln, ich hab hier ein shellscript in dem ich was erweitern möchte, das Problem stellt sich isoliert folgendermassen dar:
#!/bin/sh echo DEFANGED.12746 exit #!/bin/sh # set -xv CKSUM="/usr/bin/cksum" CKSUM_OUT=`$CKSUM tf1 tf2`
BTW: Ohne Quoting dürfte schon ein Leerzeichen im Dateinamen Deine Konstruktion zerschießen...
echo $CKSUM_OUT | read VALUE1 SIZE1 NAME1 VALUE2 SIZE2 NAME2
Durch die Pipe startest Du eine Subshell, dadurch sind die Variablen in der übergeordneten Shell nicht verfügbar. Guck mal auf meiner Homepage vorbei - http://tux.boltz.de.vu/bash/ Dort hab ich gleich zwei Varianten erklärt, wie man an Variablen aus der Subshell kommt ;-)
-- This message has been 'sanitized'. This means that potentially dangerous content has been rewritten or removed. The following log describes which actions were taken. [...]
*LoL* Kannst Du das bitte für die Liste abschalten, die resultierende Sig hat nämlich Überlänge ;-) Gruß Christian Boltz -- In diesem Fall brauchst du PraktiScript 1.0b. ("He! Praktikant! Komme er her und ziehe die Jacke wieder aus! Wochenende ist gestrichen! Diese 1000 Dateien bis Montag ausgedruckt auf meinem Tisch!") [Ratti in suse-linux]
Hi Christian, Christian Boltz schrieb:
BTW: Ohne Quoting dürfte schon ein Leerzeichen im Dateinamen Deine Konstruktion zerschießen...
ich habs ja nur als Minimalbeispiel rauskopiert um das Problem zu verdeutlichen im echten script sind alle filenamen gequoted (furchtbares denglisch)
Guck mal auf meiner Homepage vorbei - http://tux.boltz.de.vu/bash/ Dort hab ich gleich zwei Varianten erklärt, wie man an Variablen aus der Subshell kommt ;-)
das taugt für mich, merci bien!
*LoL* Kannst Du das bitte für die Liste abschalten, die resultierende Sig hat nämlich Überlänge ;-)
siehe Antwort an jan :-( in Übrigen kann ich das Teil aber wirklich empfehlen. Gruss Falk
*** Falk Sauer (falk@hb-fein.de) schrieb am Feb 23, 2004 in suse-linux:
[...] #!/bin/sh echo DEFANGED.12746 exit #!/bin/sh # set -xv
<shiver/>
CKSUM="/usr/bin/cksum" CKSUM_OUT=`$CKSUM tf1 tf2` echo $CKSUM_OUT | read VALUE1 SIZE1 NAME1 VALUE2 SIZE2 NAME2 # echo "Cksum = $CKSUM_OUT" echo "Val1 = $VALUE1" echo "Val2 = $VALUE2" echo "Nam1 = $NAME1" echo "Nam2 = $NAME2" echo "Siz1 = $SIZE1" echo "Siz2 = $SIZE2" echo " "
"man bash"! echo $CKSUM_OUT |\ while read VALUE SIZE NAME; do echo "Val=$VALUE" echo "size=$SIZE" echo "name=$NAME" done
[...]
für
-- This message has been 'sanitized'. This means that potentially dangerous content has been rewritten or removed. The following log describes which actions were taken.
Sanitizer (start="1077554903"): SanitizeFile (filename="unnamed.txt", mimetype="text/plain"): Match (rule="2"): Enforced policy: accept
Defanged UNIX shell script(s). Total modifications so far: 1
Anomy 0.0.0 : sanitizer.pl $Id: Sanitizer.pm,v 1.25 2001/09/04 15:49:11 bre Exp $
sollte man Dich hauen, auch wenn man sowas als Mail bekommt. MfG Henning Hucke -- Die Netiquette ist (lediglich) eine FAQ zu der Frage "Warum sind die anderen so genervt von mir und nennen mich immer PLONK?". [Oliver Gassner in dsn]
participants (4)
-
Christian Boltz
-
Falk Sauer
-
Henning Hucke
-
Jan.Trippler@t-online.de