Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Wieder mal ein Phänomen mit "while"

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Wieder mal ein Phänomen mit "while"

Beitrag von regexer »

Hallo zusammen!

Ich stehe wieder einmal vor einem Problem, dass ich nicht mal ansatzweise verstehe. Ich habe in einem größerem Script länger gesucht, warum eine while-Schleife nur einmal durchlaufen wird, obwohl sie das eigentlich viele Male tun sollte. Mein Schluss: Ein rsh-Kommando ist schuld daran, obwohl dieses korrekt beendet wird. Folgender Versuchsaufbau soll das ganze verdeutlichen:

Code: Alles auswählen

hostname -s  > rechner.txt
hostname -s >> rechner.txt

cat rechner.txt | while read host
do
  echo vor rsh
  rsh $host "echo rsh-test"
  echo RETC $?
done
echo nach for
rm rechner.txt
Die Ausgabe ist komischerweise:

Code: Alles auswählen

vor rsh
rsh-test
RETC 0
nach for
Wenn man den rsh auskommentiert erhält man folgendes:

Code: Alles auswählen

vor rsh
RETC 0
vor rsh
RETC 0
nach for
Warum???

Noch ein paar Anmerkungen:
- Statt while einen for nehmen funktioniert. Trotzdem will ich wissen warum
- damit der rsh kein passwort verlangt, habe ich mich in die Datei $HOME/.rhosts eingetragen
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

afaik leiten diese Shells den stdinput um, ich bin mit ssh schon mal über sowas gestolpert, d.h. die Shell (rsh) versucht die restlichen Einträge auch als Input zu verwursten.

afair hatte ich dann als Lösung der ssh den Stdin noch auf dev/null umgebogen...

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

TeXpert hat geschrieben:afaik leiten diese Shells den stdinput um, ich bin mit ssh schon mal über sowas gestolpert, d.h. die Shell (rsh) versucht die restlichen Einträge auch als Input zu verwursten.

afair hatte ich dann als Lösung der ssh den Stdin noch auf dev/null umgebogen...
Jetzt wo du es sagst: Soetwas hatte ich auch schon mal (und sogar hier ins Forum gestellt); allerdings nicht in Verbindung mit while.

Siehe http://www.linux-club.de/viewtopic.php?t=28913

Der Parameter -n hilft auch in diesem Fall.

Peinlich! Irgendwie habe ich das erfolgreich verdrängt. :oops: Zum Glück ist es nicht exakt das selbe...
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

notoxp hat geschrieben:Peinlich! Irgendwie habe ich das erfolgreich verdrängt. :oops: Zum Glück ist es nicht exakt das selbe...
:lol: wie war das mit der Suchfunktion :P

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

TeXpert hat geschrieben: :lol: wie war das mit der Suchfunktion :P
Du wirst noch mehr lachen: Ich habe die Suchfunktion benutzt und immerhin das hier gefunden: http://www.linux-club.de/viewtopic.php?t=24957

Darum auch mein Titel "Wieder ein Phänomen..."
Benutzeravatar
haveaniceday
Hacker
Hacker
Beiträge: 775
Registriert: 7. Jul 2004, 14:09
Wohnort: Paderborn

Re: Wieder mal ein Phänomen mit "while"

Beitrag von haveaniceday »

So geht es:

Code: Alles auswählen

hostname -s  > rechner.txt
hostname -s >> rechner.txt

cat rechner.txt | while read host
do
  echo vor rsh
  rsh $host "echo rsh-test" </dev/null
  echo RETC $?
done
echo nach for
rm rechner.txt
Ist anscheinend eine eigenart von der Bash. Mit einer ksh auf einem älteren Linux Rechner geht es auch ohne </dev/null


Wo wir gerade bei seltsamen Effekten sind: Habe vorgestern den heftigsten "Shock" in den letzten Jahren bekommen. Hab schon an mir gezweifelt.

Thema "Lokalisierung bash"
=> wenn LC_COLLATE nicht "C" ( oder LANG = C ) setzt mal : "LC_COLLATE=de_DE.utf8" und macht eine "echo [A-Z]*"

Ihr werdet alle Dateien mit "AaBbCcDd...Z" am Anfang sehen.

Großes OOps bei "rm -i [A-Z]*" um nur die Dateien mit Großbuchstaben zu löschen...

Siehe auch: http://cnswww.cns.cwru.edu/~chet/bash/COMPAT chapter 13.

Eine Warnung an alle: Nutzt keine "Character-range" mehr bei bash und Lokalisierung.

Hadhavenoniceday ;-)
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Re: Wieder mal ein Phänomen mit "while"

Beitrag von TeXpert »

haveaniceday hat geschrieben:So geht es:

Code: Alles auswählen

hostname -s  > rechner.txt
hostname -s >> rechner.txt

cat rechner.txt | while read host
do
  echo vor rsh
  rsh $host "echo rsh-test" </dev/null
  echo RETC $?
done
echo nach for
rm rechner.txt
Ist anscheinend eine eigenart von der Bash. Mit einer ksh auf einem älteren Linux Rechner geht es auch ohne </dev/null
danke, dass Du meine Erinnerung bestätigt hast :) bin also doch noch nicht so verkalkt...

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Antworten