While Loop in Shellscript 'gestoert'!?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

While Loop in Shellscript 'gestoert'!?

Beitrag von chabayo » 22.09.2009 14:19:46

Ahey,...

hab folgendes um korrekt kopierte Files auf dem Server zu eliminieren:

Code: Alles auswählen

#!/bin/sh

function check_delete ( ) {
        echo -n Get ragnarok:$1 md5sum ...
        sum1=`ssh ragnarok md5sum $1`
        echo done.
        echo -n Get iridium:$1 md5sum ...
        sum2=`md5sum $1`
        echo done.
        if test "$sum1"="$sum2"
                then
                echo -n Will delete $1 ...
                ssh ragnarok rm $1
                echo done.
                else
                echo Will NOT delete $1.
                fi
}

ssh ragnarok find /srv/video -type f | \
while read one
        do
        dir=`dirname $one`
        name=`basename $one`
        test -f $dir/$name && check_delete $dir/$name
        done
...der macht aber jedes mal nur einen Durchlauf. Ich hab die Vermutung das mir etwas aus der function() den Input-Stream, der ja eigentlich fuer 'read' aus dem While-Kopf gedacht waere, schluckt. Ist das wahr?

Was kann ich tun!?

Danke
Watt about the non-digital!?

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: While Loop in Shellscript 'gestoert'!?

Beitrag von chrisbra » 24.09.2009 21:31:04

Ich denke, dein ssh command, leert dein stdin. Probier mal dein ssh mit sowas hier zu starten:
ssh ... -t </dev/null
ungefähr so.
Meine Whishlist
:wq!

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Re: While Loop in Shellscript 'gestoert'!?

Beitrag von chabayo » 28.09.2009 08:05:33

Werd mir das im Auge behalten.

Hatte es aber bereits so geloest einen for-Loop aufzurufen. Zuvor setzte ich die IFS-Variable auf \n, also ohne \t und ' ', dann klappte das auch; aber, um es nicht zu vergessen: Hatte zwischenzeitlich jedoch den ssh-Output in ein Tmpfile platziert und dessen Inhalt mit `cat $tmp` als Token in den for-Steuerbefehl uebergeben.

-

Hab es aber kurz geprueft. Deine Loesung ist wohl jene die dem Problem richtig entgegentritt, sie funktioniert!

Besonders Interessant finde ich deine tty-Umleitung weil ich erst vor kurzem [url=file:///usr/share/doc/perl-doc-html/html/perlopentut.html#Open-agrave-la-shell]hier[/url] etwas Perl eingelesen hatte. Muss mir dabei merken das die Pfeile <> besser zu lesen sind wenn man den Dateinamen ohne ein Space ' ' direkt anhaengt.

-

Interessant dazu auch:
http://www.virtualuniversity.ch/guides/unix/32.html hat geschrieben: Mitunter genügen die drei Standard-Kommunikationskanäle nicht, um eine Aufgabe zu erfüllen. Soll ein Skript etwa den Inhalt dreier Dateien miteinander vermengen, benötigt es zusätzliche Eingabekanäle. In der Bourne-Shell lassen sich weitere Kanäle mit den normalen Umleitungsoperatoren öffnen; der Benutzer muß lediglich die Nummer des gewünschten Kanals angeben. Mit den Umleitungsoperatoren <& und >& kann er die neuen Kanäle für einzelne Befehle öffnen, zum Beispiel:

# Dateimischer
while read X <&3 && read Y <&4 && read Z <&5
do
echo $X $Y $Z
done 3<Datei-1 4<Datei-2 5<Datei-3
Dann danke erst mal, chrisbra.

chab
Watt about the non-digital!?

Antworten