【发布时间】:2012-10-22 00:18:44
【问题描述】:
我需要将执行此命令所用的时间写在一个txt文件中:
time ./program.exe
如何在 bash 脚本中进行操作?
我尝试使用 >> time.txt 但这不起作用(输出不会进入文件并进入屏幕)。
【问题讨论】:
标签: bash
我需要将执行此命令所用的时间写在一个txt文件中:
time ./program.exe
如何在 bash 脚本中进行操作?
我尝试使用 >> time.txt 但这不起作用(输出不会进入文件并进入屏幕)。
【问题讨论】:
标签: bash
只需将要计时的命令括在{ .. } 中:
{ 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 内结束。
【讨论】:
time_elapsed=(time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}'
echo time_elapsed > file.txt
此命令应为您提供所需文件中 bash 消耗的确切时间。
您也可以使用 2 > file.txt 将其重定向到文件,如另一个回复中所述。
【讨论】:
grep + awk)。
在bash 中获取time 写入文件是一项艰巨的工作。这是一个bash 内置命令。 (在 Mac OS X 上,有一个外部命令 /usr/bin/time,它执行类似的工作,但输出格式不同且不那么顽固。)
你需要使用:
(time ./program.exe) 2> time.txt
它写入标准错误(因此使用2> 表示法)。但是,如果您不使用子外壳(括号),它就不起作用;输出仍然出现在屏幕上。
或者,如果没有子外壳,您可以使用:
{ time ./program.exe; } 2> time.txt
注意左大括号和分号后面的空格;两者都是单行所必需的。大括号必须出现在命令可能出现的位置,并且必须是独立符号。 (如果你足够努力,你会想出...;}|something 或...;}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 的-e 选项只接受一个字符串参数,在这种情况下,我想你会使用:
xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'
您可以像我一样手动 bash xterm。
我不确定您为什么在后台模式下运行定时程序,但这是您的问题,不是我的问题。同样,如果hold: true 保持终端打开,sleep 2 显然不是必需的。
【讨论】:
重定向 bash 内置 time 的输出并不容易。
一种解决方案是使用外部time 程序:
/bin/time --append -o time.txt ./program.exe
(在大多数系统上它是一个 GNU 程序,所以使用info time 而不是man 来获取它的文档)。
【讨论】:
time 的参数必须是路径中可用的命令。