Podczas gdy pętle nie zapętlają wszystkich wartości

1

Stworzyłem kilka fragmentów kodu - w Pythonie i C - które muszą być uruchamiane wiele razy, każdy z nowym zestawem wartości wejściowych. Aby to zrobić, stworzyłem skrypt powłoki Unixa, który powinien uruchamiać różne programy dla wielu różnych danych wejściowych:

#!/bin/sh
_file="${1:-/dev/null}"

while IFS=' ' read -r f1 f2 f3 f4  
do
    cd folder1
    cd folder2
    echo "$f1 $f2 $f3 $f4 " > inputs.txt
    mpiexec -n 4 a_C_code
    cd ..
    cd ..
    python3 python_code_1.py
    python python_code_2.py
    python python_code_3.py
    python python_code_4.py
    echo "$f1" #So I know how many times the loops has been performed

done < "$_file"

Plik wczytywany do skryptu ma następującą postać:

1 2 3 4
5 6 7 8
...

Jednak po uruchomieniu programu zapętla on tylko pierwszy zestaw danych wejściowych (w tym przykładzie 1 2 3 4) i kończy się bez uruchamiania programów dla różnych innych zestawów danych wejściowych.

JasKa071
źródło
1
Być może jedno z poleceń w pętli wykorzystuje standardowe wejście? zobacz przykład przetwarzania polecenia wyjściowego wiersz po wierszu, bez mieszania standardowego wejścia
steeldriver

Odpowiedzi:

1

Kod powłoki wygląda OK, a uproszczona wersja tekstowa działa zgodnie z oczekiwaniami:

seq 12 | paste - - - - | 
while IFS=' ' read -r f1 f2 f3 f4 ; do 
    echo "$f1 $f2 $f3 $f4 " 
done

Wynik:

1   2   3   4    
5   6   7   8    
9   10  11  12   

Dlatego komentarz steeldrivera jest prawdopodobnie poprawny i albo mpiexecjeden z pythonprogramów zużywa pozostałe linie wejściowe, aby echo nigdy nie dostać się do drugiej linii wejściowej.

Jako przykład rozważ powyższy kod z dodanym jeszcze jednym głodnym zestawem poleceń:

seq 12 | paste - - - - | 
while IFS=' ' read -r f1 f2 f3 f4 ; do 
     echo "$f1 $f2 $f3 $f4 "
     (read x; read x; read x;) 
done

Dane wyjściowe (zwróć uwagę na brakujące linie):

1   2   3   4   
agc
źródło
Dziękuję bardzo za odpowiedź. Okazuje się, że mpiexec zużywa resztę wejść.
JasKa071