Как использовать счетчик для цикла в качестве входных данных в файле Bash - PullRequest
0 голосов
/ 26 октября 2019

Я хочу запустить код переменного тока несколько раз. В коде c переменная (n) считывает значение из командной строки. Я хочу написать файл Bash, чтобы сделать это для меня. Но я не знаю, как прочитать значение внутри цикла в файле Bash. файл bash выглядит так:

#!/bin/bash

EXE=exc3_1
RES=$EXE.d
for i in 2 4 8 16
do  
  COMMAND="mpirun -n $i $EXE >> $RES"
  echo $COMMAND
  eval $COMMAND 
done

gnuplot << EOF
set datafile separator " "
set xlabel "Num of procs"
set ylabel "time of operation"
set title "weak scaling of trapezoidal rule"
plot $RES
EOF

и после команды eval $COMMAND мне следует прочитать значение для n.

"EDITED" и значение n должно использоваться для входного аргумента в коде ac следующим образом:

scanf("%d", &N);

Я имею в виду, что на каждой итерации в файле bash следует читать Nиз командной строки и использовать в качестве ввода для

scanf("%d", &N);

в коде переменного тока.

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

для использования ввода командной строки в качестве ввода для файла можно использовать оператор канала |, например,

read n
echo $n | eval $COMMAND

, поэтому файл bash следует изменить следующим образом:

#!/bin/bash

EXE=exc3_1
RES=$EXE.d
for i in 2 4 8 16
do  
  COMMAND="mpirun -n $i $EXE >> $RES"
   echo $COMMAND
   read n
   echo $n | eval $COMMAND 
done

gnuplot << EOF
set datafile separator " "
set xlabel "Num of procs"
set ylabel "time of operation"
set title "weak scaling of trapezoidal rule"
plot $RES
EOF
0 голосов
/ 26 октября 2019

Чтобы прочитать что-то из внешней команды, вы можете пойти двумя путями: 1: прочитать непосредственно вывод команды;и 2: перенаправить вывод команды в какое-то известное место и прочитать оттуда.

COMMAND = "mpirun -n $ i $ EXE >> $ RES"
echo$ COMMAND

Кажется, что вы хотите прочитать какой-то вывод из "mpirun", и вы решили перенаправить его вывод. В вашем коде вывод команды mpirun будет записан (предупреждение: добавлено ) в файл с именем exc3_1.d. Вероятно, вы хотите выдать что-то вроде:

COMMAND="mpirun .... > ..."
eval $COMMAND              # execute the command
read yourvar < exc3_1.d    # read from where mpirun wrote to

НО, я думаю, что вместо перенаправления вывода mpirun, было бы лучше прочитать прямо с него:

yourvar=$($COMMAND)

Приведенная выше строка выполняет то, что указано в скобках, принимает вывод и сохраняет в переменной с именем «yourvar».

[РЕДАКТИРОВАТЬ после комментария] Я думаю, что лучшим вариантом является запуск вашей команды, как показано выше, особенноесли вы используете многозадачность. Но я понятия не имею, для чего вы используете mpirun ... Я говорю это, потому что есть много способов, но все они справляются со "стандартным выводом", механизмом, который вы должны понять, прежде чем продолжать.

Во второй части разверните контент, передав его в программу на C, это другой вопрос - возможно, другой вопрос на этом сайте может помочь. Опять же, есть два способа, через scanf ():

echo $myvalue | $mycommand   # pass to standard input

(программа, запускаемая $ mycommand, читает через scanf ()), или:

eval "$mycommand $myvalue"

(подходит для передачиmyvalue как параметр). Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...