我需要在txt文件中写下执行此命令所花费的时间:
time ./program.exe
我怎么能用bash脚本做什么?
我尝试使用>> time.txt
,但这不起作用(输出不会转到文件并转到屏幕上)。
答案 0 :(得分:21)
让time
bash
写入文件是一项艰苦的工作。它是bash
内置命令。 (在Mac OS X上,有一个外部命令/usr/bin/time
,它执行类似的工作,但具有不同的输出格式和较少的顽固性。)
您需要使用:
(time ./program.exe) 2> time.txt
它写入标准错误(因此为2>
表示法)。但是,如果您不使用子shell(括号),它将不起作用;输出仍然出现在屏幕上。
或者,如果没有子shell,您可以使用:
{ 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"
关键的变化是运行shell,脚本来自-c
选项的参数;您可以使用sh
或同等名称替换/bin/bash
。这应该解决任何“语法错误”问题。我不太确定是什么触发了这个错误,因此可能有一种更简单,更好的方法来处理它。也可以想象xterm
的{{1}}选项只接受一个字符串参数,在这种情况下,我想你会使用:
-e
您也可以手动bash xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'
。
我不确定为什么你在后台模式下运行定时程序,但这是你的问题,而不是我的问题。同样,如果xterm
保持终端开放,则sleep 2
显然不是必需的。
答案 1 :(得分:0)
重定向bash内置time
的输出并不容易。
一种解决方案是使用外部time
程序:
/bin/time --append -o time.txt ./program.exe
(在大多数系统上,它是一个GNU程序,因此请使用info time
而不是man
来获取其文档。
答案 2 :(得分:0)
TIME_ELAPSED = (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}'
echo time_elapsed> file.txt的
此命令应该为您提供所需文件中bash消耗的确切时间..
您还可以将其重定向到文件usng 2> file.txt,如另一个回复中所述。
答案 3 :(得分:0)
只需将命令括在{ .. }
:
{ 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内结束。