将输出重定向到终端到批处理文件中的文件

时间:2018-09-13 00:14:34

标签: bash

for((i=1;i<15;i=i+1));
   do
   mpirun -np $i a.out
   done

a.out中,有printf个将一些中等结果输出到屏幕上。如何将它们重定向到名为output.txt的文件?

1 个答案:

答案 0 :(得分:1)

根据我的评论,您有几种选择,可以选择如何将调用mpiruna.out的shell脚本的输出重定向到输出文件。

  1. 最常见和最简单的方法是将shell脚本的整个输出重定向到输出文件,例如bash scriptname.sh > output.txt;
  2. 第二个选项是重定向mpirun -np $i a.out命令本身的输出,该命令在您显示的示例中将写入输出文件14次,例如mpirun -np $i a.out >> output.txt,请注意要附加到文件的>>重定向(另外,请注意,如果您每次都需要写入一个空文件,则您希望在循环之前截断output.txt);
  3. 类似于上面的2.,您可以在子shell中执行mpirun命令,该命令在您的示例中花了很少的钱,但在某些情况下是一种选择和帮助;和
  4. 仅将Shell脚本中的循环产生的输出重定向到output.txt的最佳方法是使用括号括起来的组允许对产生的整个输出进行一次重定向通过循环,例如{ for ((...)); do ... done } > output.txt

例如,如果您的mpirun ...命令将输出生成到stdout(类似于下面的简单示例)

#include <stdio.h>

int main (int argc, char **argv) {

    char *s = argc > 1 ? argv[1] : "default";

    printf ("%s\n", s);

    return 0;
}

(编译为echoarg

一个模仿您的循环并使用大括号括起来的组重定向到output.txt的示例shell脚本可以写为:

#!/bin/bash

exefile="${1:-./bin/echoarg}"   ## executable to call
outfile="${2:-output.txt}"      ## output file name
:> "$outfile"                   ## truncate outfile

[ -x "$exefile" ] || {
    printf "error: file not executable '%s'\n" "$exefile"
    exit 1
}

## braced group encosing for loop redirected to outfile
{
for ((i = 1; i < 15; i++))
do
    ./bin/echoarg "$i"
done
} > "$outfile"

使用/输出/结果文件示例

$ ./echoarg.sh ./bin/echoarg dat/outfile.txt

$ cat dat/outfile.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14

仔细检查一下,如果还有其他问题,请告诉我。