BASH:将命令的输出写入文件

BASH:将命令的输出写入文件

我使用 bash 脚本多次运行一个程序,并希望将其输出写入文件中。但是,我无法使运算符“>filename.txt”工作...这是我的脚本:

for i in {1..10000000..10000}
do
    time ./merge $i>nn
done

有人能帮我吗?

更新:

答案是:

{ time ./merge $i ; } 2>> time.txt

答案1

time有点搞笑。它是 Bash 内置的,所以你需要做的第一件事就是将它限制为正确的命令。你可以通过使用括号将其分组或使用括号将其子化来实现这一点。

然后你需要注意它输出到STDERR。默认情况下它不会被重定向,但我们可以通过重定向STDERRSTDOUT然后重定向 来解决这个问题。

最后(正如 choroba 在我之前发现的),>默认情况下使用将覆盖。在循环中执行此操作将导致文件中仅显示最后一次迭代。您想要的>>是附加的。

{ time ./merge $i ; } >> nn 2>&1

如果您不想要任何原始内容STDOUT,而只想要时间输出,您可以运行以下命令:

{ time ./merge $i >/dev/null 2>&1; } 2>> nn

这将丢弃命令的所有输出,并且仅从更广泛的块中./merge重定向。STDERR


就像一个测试工具来展示这个工作原理:

$ for i in {1..10}; do { time echo $i >/dev/null 2>&1; } 2>> nn ; done
$ wc -l nn
40 nn

这是 10×4 行时间块(回声输出被抑制)。

答案2

每次循环都会覆盖该文件。可以将整个循环重定向到该文件

for i in {1..10000000..10000}
do
    time ./merge $i
done > nn

或者,使用附加:

for i in {1..10000000..10000}
do
    time ./merge $i >> nn
done

答案3

time将其结果打印到标准错误,而不是标准输出。因此,您需要使用 重定向前者,2>而不是使用 重定向后者>。您的下一个问题是您正在捕获 和 的输出./merge,而不是 的输出。因此,您需要将和命令time分组,然后重定向time./merge他们的输出。这可以通过在单独的子 shell 中运行它们或在当前 shell 中对它们进行分组来完成:

  1. 在单独的子 shell 中运行

    for i in {1..10000000..10000}
    do
      ( time ./merge $i ) 2>> nn
    done
    
  2. 在同一个 shell 中运行

    for i in {1..10000000..10000}
    do
      { time ./merge $i; } 2>> nn
    done
    

在这种特殊情况下,两种方法没有实际区别。

答案4

bash 固有时间与 /usr/bin/time 不同。后者允许您将时间附加到文件:

/usr/bin/time --append --outout=outputfile command

相关内容