I have created a few pieces of code - in python and C – that have to be run multiple times, each run with a new set of input values. To do so, I have created a Unix shell script which should run the various programs for the number of different inputs:
#!/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"
The file that is being read into the script has the following form:
1 2 3 4
5 6 7 8
...
However, when I execute the program, it only loops through the first set of inputs (in this example, 1 2 3 4) and finishes without running the programs for the various other sets of inputs.
-
1Perhaps one of the commands inside the loop is consuming standard input? see for examle processing command output line by line, without mixing standard inputsteeldriver– steeldriver2019年04月07日 01:51:58 +00:00Commented Apr 7, 2019 at 1:51
1 Answer 1
The shell code looks OK, and a simplified text version works as expected:
seq 12 | paste - - - - |
while IFS=' ' read -r f1 f2 f3 f4 ; do
echo "$f1 $f2 $f3 $f4 "
done
Output:
1 2 3 4
5 6 7 8
9 10 11 12
Therefore steeldriver's comment is probably correct, and either the mpiexec
or one of the python
programs are consuming the remaining lines of input so that echo
never gets to the second line of input.
As an example, consider the above code with one more hungry set of commands added:
seq 12 | paste - - - - |
while IFS=' ' read -r f1 f2 f3 f4 ; do
echo "$f1 $f2 $f3 $f4 "
(read x; read x; read x;)
done
Output (note the missing lines):
1 2 3 4
-
Thank you so much for your answer. It turns out that mpiexec is consuming the remainder of the inputs.JasKa071– JasKa0712019年04月07日 02:52:32 +00:00Commented Apr 7, 2019 at 2:52