16

我需要在 txt 文件中写下执行此命令所需的时间:

time ./program.exe

如何在 bash 脚本中执行?

我尝试了,>> time.txt但这不起作用(输出不会进入文件并进入屏幕)。

4

4 回答 4

24

进入写入文件是一项艰苦的工作timebash这是一个bash内置命令。(在 Mac OS X 上,有一个外部命令 ,/usr/bin/time它可以完成类似的工作,但输出格式不同且不那么顽固。)

你需要使用:

(time ./program.exe) 2> time.txt

它写入标准错误(因此是2>符号)。但是,如果您不使用子外壳(括号),它就不起作用;输出仍然出现在屏幕上。


或者,如果没有子外壳,您可以使用:

{ time ./program.exe; } 2> time.txt

注意左大括号和分号后面的空格;两者都是单行所必需的。大括号必须出现在命令可能出现的位置,并且必须是独立符号。(如果你足够努力,你会想出...;}|somethingor ...;}2>&1。不过,这两个都将大括号标识为独立符号。如果你尝试...;}xyz,shell 将(可能)找不到名为 的命令}xyz。)


我需要在更多终端中运行更多命令。如果我这样做:

 xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2

它不起作用并告诉我Syntax error: "(" unexpected。我该如何解决?

您需要执行以下操作:

xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2"

关键变化是使用来自-c选项参数的脚本运行 shell;您可以替换sh/bin/bash或等效名称。这应该可以解决任何“语法错误”问题。不过,我不太确定是什么触发了该错误,因此可能有一种更简单、更好的方法来处理它。也可以想象xterm's-e选项只接受一个字符串参数,在这种情况下,我想你会使用:

xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'

xterm您可以像我一样手动 bash 。

我不确定你为什么在后台模式下运行定时程序,但这是你的问题,不是我的问题。同样,如果保持终端打开,sleep 2则显然没有必要。hold: true

于 2012-11-01T12:03:45.260 回答
0

重定向 bash builtin 的输出并不容易time

一种解决方案是使用外部time程序:

/bin/time --append -o time.txt ./program.exe

(在大多数系统上它是一个 GNU 程序,所以使用info time而不是man获取它的文档)。

于 2012-11-01T12:06:12.907 回答
0

time_elapsed= (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}' echo time_elapsed > file.txt 此命令应该为您提供所需文件中 bash 消耗的确切时间。

您还可以使用 2 > file.txt 将其重定向到文件,如另一个回复中所述。

于 2012-11-13T07:49:27.013 回答
0

只需将时间命令括在 a 中{ .. }

{ time ./program.exe; } 2>&1

当然,内置时间的输出到 stderr,因此需要重定向2>&1

然后,捕获输出可能看起来很棘手,让我们花{ .. }一点时间更轻松地阅读命令,这很有效:

{ { time ./program.exe; } 2>&1; } >> time.txt              # This works.

但是,正确的构造应该只是将捕获反转,如下所示:

{ time ./program.exe; } >> time.txt  2>&1;                 # Correct.

要关闭命令的任何可能输出,请将其输出重定向到 /dev/null,如下所示:

{ time ./program.exe >/dev/null 2>&1; } >> time.txt 2>&1   # Better.

而且,由于现在 stderr 上只有输出,我们可以简单地捕获它:

{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt       # Best.

./program 的输出应该被重定向,或者它很可能在 time.txt 内结束。

于 2015-10-01T05:34:28.963 回答