运行另一个脚本后循环中断时Bash脚本

运行另一个脚本后循环中断时Bash脚本,bash,Bash,当循环运行但循环中断时,在bash脚本中运行另一个脚本! 注意,我提到的脚本只是在当前目录中的文件上循环,然后运行mpirun。 下面是我的bash脚本: #!/bin/bash np="$1" bin="$2" ref="$3" query="$4" word_size="$5" i=1; input="$query" while read line; do echo $line if [[ "${line:0:1}" == ">" ]] ; then header="$l

当循环运行但循环中断时,在bash脚本中运行另一个脚本! 注意,我提到的脚本只是在当前目录中的文件上循环,然后运行mpirun。 下面是我的bash脚本:

#!/bin/bash
np="$1"
bin="$2"
ref="$3"
query="$4"
word_size="$5"

i=1;
input="$query"
while read line; do
echo $line
  if [[ "${line:0:1}" == ">" ]] ; then
    header="$line"
    echo "$header" >> seq_"${i}".fasta
  else
    seq="$line"
    echo "$seq" >> seq_"${i}".fasta
    if ! (( i % 5)) ; then
        ./run.sh $np $bin $ref $word_size
        ^^^^^^^^
        #for filename in *.fasta; do
        #    mpirun -np "${np}" "${bin}" -d "${ref}" -ql "${filename}" -k "${word_size}" -b > log
        #    rm $filename
        #done
    fi
    ((i++))
  fi
done < $input
问题是run.sh脚本没有向mpirun传递任何参数。该脚本将变量${np}${bin}${ref}${filename}${word\u size}传递给mpirun,但这些变量是主脚本的本地变量,在run.sh中未定义。您可以在主脚本中导出这些变量,以便所有子进程都可以使用它们,但更好的解决方案是在run.sh中使用位置参数:


环路什么时候断?此循环退出的唯一方式是,如果没有更多数据可从$query命名的文件中读取,则情况并非如此。仍有许多行需要读取,但在第一次run.sh运行循环中断后,是否从标准输入读取run.sh?它从循环中继承其标准输入,因此在读取行有机会再次执行之前,它将消耗其余的数据。不,它没有,run.sh只是在当前目录中的文件上循环,然后运行另一个程序,并将每个文件传递给刚才由run调用的程序。sh@chepner是的,mpirun也不是这样的,我说忘记run.sh脚本,如果我调用mpirun而不是run.sh,mpirun将正常工作一次,主while循环在运行mpirun后中断,但是如果我调用ls命令而不是mpirun或run.sh,则while循环工作,ls将运行多次。然后我怀疑您以错误的顺序将参数传递给mpirun。当然,在传递${bin}参数之前,应该先传递命令行选项及其值。如果直接从命令行而不是通过此脚本调用mpirun,会发生什么情况?
for filename in *.fasta; do
  mpirun -np "${1}" "${2}" -d "${3}" -ql "${4}" -k "${5}" -b > log
  rm $filename
done