Mit Hilfe einer while-Schleife wird eine Datei in der Mitte nach dem Zufallsprinzip gelesen

1595
noisesolo

Ich habe einen kleinen Codeabschnitt, der eine Datei liest, $ FUNCTION_FILE, die eine Liste von Funktionsnamen im Format enthält:

func1 func2 func3 

Es liest eine Zeile, führt die Funktion aus und wiederholt, bis die Datei fertig ist. Hier ist ein Ausschnitt:

while read line; do LINE_NUMBER=`expr $LINE_NUMBER + 1` echo "LINE_NUMBER=$LINE_NUMBER"  $func done <$FUNCTION_FILE 

Ich bin in eine Situation geraten, in der dieser Abschnitt des Codes manchmal "$ FUNCTION_FILE" liest, bevor er fertig ist, und mit dem Rest des Skripts fortfahren. Manchmal liest es nur die erste Zeile und überspringt den Rest, manchmal nur die zweite Zeile. Ich sehe auch nie die Meldung "LINE_NUMBER = $ LINE_NUMBER" für die nachfolgenden Zeilen.

Angenommen, die Datei ist korrekt, was könnte dieses Problem für mich bedeuten?

1
Enthält eine Zeile "exit"? choroba vor 10 Jahren 0
Sie bitten uns, beliebigen Code zu debuggen, den wir nicht sehen können? Alles könnte passieren, es kommt darauf an, was die $ func sind. Bitte zeigen Sie uns, welche Funktionen Sie gerade ausführen. Andernfalls können wir Ihnen nicht helfen. terdon vor 10 Jahren 0
Entschuldigung, dass ich so kryptisch bin. Ich bin nicht in der Lage, den eigentlichen Code preiszugeben. Ich versuche meistens, Informationen darüber zu sammeln, wie ein Skript das Standardeintrittswerk manipulieren kann (wie die erste Antwort vermuten lässt). Danke für Ihre Zeit, ich weiß es wirklich zu schätzen. noisesolo vor 10 Jahren 0

1 Antwort auf die Frage

3
glenn jackman

Liest eine Ihrer Funktionen von stdin (zB: der readBefehl)? In diesem Fall wird der Rest der FUNCTION_FILE verschluckt.

Ändern Sie die while-Schleife, um einen anderen Dateideskriptor zu verwenden:

line_num=0 while read -u3 line; do echo "LINE_NUMBER=$(( ++line_num ))" $func done 3<"$function_file" 

Holen Sie sich die Gewohnheit, ALL_CAPS_VARIABLES zu verwenden - eines Tages verwenden Sie versehentlich "PATH" und brechen Ihr Skript.

Danke für den Vorschlag, ich werde tiefer schauen und sehen, ob dies der Fall ist. Leider sind viele der Konventionen Opfer einer äußerst alten und großen Codebasis, aber ich schätze Ihren Rat sehr und werde mich in meinen eigenen Bemühungen darum kümmern. noisesolo vor 10 Jahren 0