我使用 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
。默认情况下它不会被重定向,但我们可以通过重定向STDERR
到STDOUT
然后重定向 来解决这个问题。
最后(正如 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 中对它们进行分组来完成:
在单独的子 shell 中运行
for i in {1..10000000..10000} do ( time ./merge $i ) 2>> nn done
在同一个 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