shell-command 'read' liest nicht korrekt von stdin [t-GW_H]
hallo liebe mailingliste :) ich habe hier ein problem mit dem shellcommand 'read' read liest angeblich eine zeile von stdin, trennt diese zeile anhand der in IFS definierten trennzeichen auf und packt die stuecke in die als argumente uebergebenen variablen. ich kann mit 'read A B C < /test' auch ganz wundervoll den eingabedatenstrom auf eine datei umlenken, aber ich kann an read nichts pipen!?! :konfused: warum? 'echo "100 200 300" | read A B C' muesste bei einem 'echo $A $B $C' eigentlich '100 200 300' ausgeben. wenn ich den string per hand (ueber prompt) eingebe tut das auch. hat jemand eine idee? danke schonmal im vorraus! gruss marc
Hallo Marc Wenn ich mich recht erinnere dann macht die bash eine neue für shell auf. d.h. du kannst die variablen nicht an die parent shell übergeben mit der kornshell sollte es gehen. gruss frank Am Montag, 6. Mai 2002 14:23 schrieb Marc Schroetel:
hallo liebe mailingliste :)
ich habe hier ein problem mit dem shellcommand 'read' read liest angeblich eine zeile von stdin, trennt diese zeile anhand der in IFS definierten trennzeichen auf und packt die stuecke in die als argumente uebergebenen variablen.
ich kann mit 'read A B C < /test' auch ganz wundervoll den eingabedatenstrom auf eine datei umlenken, aber ich kann an read nichts pipen!?!
:konfused:
warum? 'echo "100 200 300" | read A B C' m'echo "100 200 300" | read A B C' muesste bei einem 'echo $A $B $C' eigentlich '100 200 3uesste bei einem 'echo $A $B $C' eigentlich '100 200 300' ausgeben. wenn ich den string per hand (ueber prompt) eingebe tut das auch.
hat jemand eine idee?
danke schonmal im vorraus!
gruss marc
Hallo Marc, * Am 06.05.2002 um 14:23 Uhr schrieb Marc Schroetel:
ich kann mit 'read A B C < /test' auch ganz wundervoll den eingabedatenstrom auf eine datei umlenken, aber ich kann an read nichts pipen!?! :konfused: warum? 'echo "100 200 300" | read A B C' muesste bei einem 'echo $A $B $C' eigentlich '100 200 300' ausgeben. wenn ich den string per hand (ueber prompt) eingebe tut das auch.
versuch's mal mit: echo 100 200 300 | (read A B C; echo "($A)($B)($C)") -Juergen -- Der Computer löst Probleme, die man ohne ihn nicht hätte. / Registered Linux-User #130804 http://counter.li.org \ \ Linux Stammtisch Bremerhaven http://linux.hs-bremerhaven.de /
Hi Marc, Scheint mir auch eine böse Falle zu sein! `help read' suggeriert mir auch, dass das eigentlich gehen sollte. Man findet aber auch in `man bash' unter "COMMAND EXECUTION ENVIRONMENT": [...] Builtin commands that are invoked as part of a pipeline are also executed in a subshell environment. Changes made to the subshell environment cannot affect the shell's execution environment. Sprich, die Änderungen, die `read' am Environment vornimmt (setzten der Umgebungsvariablen) werden nach beenden der Pipe nicht übernommen. Der Test:
echo "1 2 3" > /tmp/123 ; read
Es gibt bestimmt einen furchtbar guten Grund dafür.. Vielleicht hilft dir ja der Trick mit den Klammern.. Leider kann ich dir auch nicht verraten, warum _der_ funktioniert.. Gruß, Peter
* Peter vom Stein schrieb am 06.Mai.2002: Bitte Vorredner erwähnen.
echo "1 2 3" > /tmp/123 ; read
Es gibt bestimmt einen furchtbar guten Grund dafür.. Vielleicht hilft dir ja der Trick mit den Klammern.. Leider kann ich dir auch nicht verraten, warum _der_ funktioniert..
Weil dadurch ein neuer Prozeß mit neuer shell eröffnet wird. Über eine Pipe kann ja kein Prozeß mit sich selber komunizieren, sondern nur mit einem anderen. Wüßte auch nicht wofür das gut sein soll. read ist zum Einlesen da, wenn man die Eingabe umlenkt, dann kann man doch gleich den Variablen zuweisen: A="Wert" B=`Programm` usw. da braucht man doch keine Klimmzüge mit read zu machen. Bernd -- Bei Fragen an die Liste erst mal nachschauen, ob es diese Frage nicht schon einmal gegeben hat. Ein Archiv der Liste findest Du auf: http://lists.suse.com/archives/suse-linux |Zufallssignatur 7
nein kann ich nicht, wie denn auch?
ich nehme mir die ausgabe eines programmes und hol mir einen bestimmten wert
aus dem zurueckgelieferten text.
dazu brauche ich read, ansonsten kriege ich den text nicht
auseinandergenommen.
konkret:
ich suche mir in der ausgabe von ifconfig die ip des devices das ich angebe.
'erstmal IFS=" :"'
dann
'(ifconfig ppp0 | grep "inet addr")'
gibt mir schonmal nur die zeile aus die ich brauche
dann noch das ergebnis an '(read A B C; echo $C)' pipen
und es kommt die ip raus
das ganze kann ich jetzt entweder einer variablen zuweisen oder ausgeben
etc.
wenn du eine bessere moeglichkeit kennt, bitte, ich lerne gerne dazu :)
gruss und big thx
marc
----- Original Message -----
From: "Bernd Brodesser"
* Peter vom Stein schrieb am 06.Mai.2002:
Bitte Vorredner erwähnen.
echo "1 2 3" > /tmp/123 ; read
Es gibt bestimmt einen furchtbar guten Grund dafür.. Vielleicht hilft dir ja der Trick mit den Klammern.. Leider kann ich dir auch nicht verraten, warum _der_ funktioniert..
Weil dadurch ein neuer Prozeß mit neuer shell eröffnet wird. Über eine Pipe kann ja kein Prozeß mit sich selber komunizieren, sondern nur mit einem anderen. Wüßte auch nicht wofür das gut sein soll. read ist zum Einlesen da, wenn man die Eingabe umlenkt, dann kann man doch gleich den Variablen zuweisen: A="Wert" B=`Programm` usw. da braucht man doch keine Klimmzüge mit read zu machen.
Bernd
-- Bei Fragen an die Liste erst mal nachschauen, ob es diese Frage nicht schon einmal gegeben hat. Ein Archiv der Liste findest Du auf: http://lists.suse.com/archives/suse-linux
|Zufallssignatur 7
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
* Marc Schroetel schrieb am 06.Mai.2002:
nein kann ich nicht, wie denn auch?
Auf Welche Frage antwortest Du?
ich nehme mir die ausgabe eines programmes und hol mir einen bestimmten wert aus dem zurueckgelieferten text. dazu brauche ich read, ansonsten kriege ich den text nicht auseinandergenommen.
Nimm doch set.
konkret: ich suche mir in der ausgabe von ifconfig die ip des devices das ich angebe. 'erstmal IFS=" :"' dann '(ifconfig ppp0 | grep "inet addr")'
Warum das in Klammern?
gibt mir schonmal nur die zeile aus die ich brauche dann noch das ergebnis an '(read A B C; echo $C)' pipen und es kommt die ip raus das ganze kann ich jetzt entweder einer variablen zuweisen oder ausgeben etc.
wenn du eine bessere moeglichkeit kennt, bitte, ich lerne gerne dazu :)
IFS=" :" set -- `ifconfig ppp0 | grep "inet addr"` Dann hast Du alles in den Positionsvariablen. Die -- deshalb, weil die Ausgabe von ifconcig ... zumindest theoretisch auch mit einem - anfangen könnte. Du könntest auch erst mal alles in einer Variablen speichern, und dann mit ${parameter/pattern/string} oder ${parameter%word} bzw. ${parameter#word} konstrukte bearbeiten. Siehe hierzu man bash und suche dort nach Parameter Expansion. Wenn es aber nur um die ip-Adresse geht, dann schreib das ganze doch in der /etc/ppp/ip-up.local. Da steht in der $4 die lokale IP-Adresse und in $5 die des Providers. Das geht natürlich nur unmittelbar nach dem Einwählen. Aber danach ändert sich die IP ja auch nicht mehr.
----- Original Message -----
http://learn.to/quote Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
Hallo, Bitte lass das TOFU (Text Oben, Fullquote Unten) sein. On Mon, 06 May 2002, Marc Schroetel wrote:
ich suche mir in der ausgabe von ifconfig die ip des devices das ich angebe. 'erstmal IFS=" :"' dann '(ifconfig ppp0 | grep "inet addr")' gibt mir schonmal nur die zeile aus die ich brauche dann noch das ergebnis an '(read A B C; echo $C)' pipen und es kommt die ip raus
==== ~/dynip.sh ==== #!/bin/sh /sbin/ifconfig ppp0 | sed -n 's/.*addr:\([0-9\.]*\).*/\1/p'; ==== -dnh -- PC's are designed by a committee of people who are in different companies in different countries and who never talk to each other. -- Derick Siddoway And nobody speaks the same language and they hate each other... -- Chris Adams
Hi! Demnächst kein TOFU bitte!!! On Mon, Mai 06, 2002 at 07:33:26 +0200, Marc Schroetel wrote:
konkret: ich suche mir in der ausgabe von ifconfig die ip des devices das ich angebe. 'erstmal IFS=" :"' dann '(ifconfig ppp0 | grep "inet addr")' gibt mir schonmal nur die zeile aus die ich brauche dann noch das ergebnis an '(read A B C; echo $C)' pipen und es kommt die ip raus das ganze kann ich jetzt entweder einer variablen zuweisen oder ausgeben etc.
wenn du eine bessere moeglichkeit kennt, bitte, ich lerne gerne dazu :)
Z.B. für ppp0 (ist aber auch für ethX anpaßbar): $ ifconfig ppp0 | grep inet | cut -c21- | cut -c-15 Such mal im Archiv, da gibts mit Sicheit x weitere Lösungen, bestimmt auch noch besser mit sed und so. [ Total unnötiges TOFU entsorgt!!!! ] -- Christian Schoepplein | http://www.lily-rockt.de mail@schoeppi.net | http://www.lavish.de
participants (7)
-
B.Brodesser@t-online.de
-
Christian Schoepplein
-
David Haller
-
Frank.Markwort@t-online.de
-
Juergen Schwarting
-
Marc Schroetel
-
Peter vom Stein