我需要编写在txt文件中执行此命令所花费的时间:
time ./program.exe
我该如何在bash脚本中执行?
我尝试使用>> time.txt
,但这不起作用(输出不转到文件并确实输入屏幕)。
在bash
中获取time
写入文件是艰苦的工作。它是bash
内置命令。(在Mac OS X上,有一个外部命令/usr/bin/time
,可以执行类似的作业,但具有不同的输出格式,较少的recalcitrance。)
您需要使用:
(time ./program.exe) 2> time.txt
它写入标准错误(因此2>
表示法)。但是,如果您不使用子壳(括号),则它不起作用。输出仍在屏幕上。
另外,如果没有子壳,您可以使用:
{ time ./program.exe; } 2> time.txt
请注意开放式支撑和半彩色后的空间;两者都是在一行上必要的。必须在命令出现的位置出现牙套,并且必须是独立的符号。(如果您足够努力挣扎,您会想出...;}|something
或...;}2>&1
。但是,这两个都将支撑识别为独立符号。如果您尝试...;}xyz
,则外壳将(可能)无法找到一个称为}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
选项。您可以用/bin/bash
或同等名称替换sh
。那应该解决任何"语法错误"问题。我不太确定什么触发了该错误,因此可能会有一种更简单,更好的方法来处理它。xterm
'S -e
选项仅采用单个字符串参数,在这种情况下,我想您会使用:
xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'
您可以尽可能手动bash xterm
。
我不确定为什么您在后台模式下运行定时程序,但这是您的问题,而不是我的。同样,如果hold: true
保持终端打开。
sleep 2
。 time_elapsed = (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}'
echo time_elapsed> file.txt此命令应为您提供所需文件中bash中的确切时间。
您也可以将其重定向到文件USNG 2> file.txt,如另一个答复中所述。
重定向bash内置的输出time
。
一种解决方案是使用外部time
程序:
/bin/time --append -o time.txt ./program.exe
(在大多数系统上,这是一个GNU程序,因此请使用info time
而不是man
获取其文档)。
只是将命令包装在 { .. }
中:
{ 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.
应重定向到./程序的输出,否则它可能会在时间内结束。