我需要在 txt 文件中写下执行此命令所需的时间:
time ./program.exe
如何在 bash 脚本中执行?
我尝试了,>> time.txt
但这不起作用(输出不会进入文件并进入屏幕)。
我需要在 txt 文件中写下执行此命令所需的时间:
time ./program.exe
如何在 bash 脚本中执行?
我尝试了,>> time.txt
但这不起作用(输出不会进入文件并进入屏幕)。
进入写入文件是一项艰苦的工作time
。bash
这是一个bash
内置命令。(在 Mac OS X 上,有一个外部命令 ,/usr/bin/time
它可以完成类似的工作,但输出格式不同且不那么顽固。)
你需要使用:
(time ./program.exe) 2> time.txt
它写入标准错误(因此是2>
符号)。但是,如果您不使用子外壳(括号),它就不起作用;输出仍然出现在屏幕上。
或者,如果没有子外壳,您可以使用:
{ time ./program.exe; } 2> time.txt
注意左大括号和分号后面的空格;两者都是单行所必需的。大括号必须出现在命令可能出现的位置,并且必须是独立符号。(如果你足够努力,你会想出...;}|something
or ...;}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
重定向 bash builtin 的输出并不容易time
。
一种解决方案是使用外部time
程序:
/bin/time --append -o time.txt ./program.exe
(在大多数系统上它是一个 GNU 程序,所以使用info time
而不是man
获取它的文档)。
time_elapsed= (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}'
echo time_elapsed > file.txt 此命令应该为您提供所需文件中 bash 消耗的确切时间。
您还可以使用 2 > file.txt 将其重定向到文件,如另一个回复中所述。
只需将时间命令括在 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 内结束。