我可以将时差命令的输出写入文件吗?

我可以将时差命令的输出写入文件吗?

我可以将时差命令的输出写入文件吗?

例如,我尝试过:

$ time foo.sh > bar.txt

但它只将 foo.sh 的输出提供给 bar.txt。

答案1

在许多 shell 中,包括ksh,zshbash,time是一个关键字,用于对管道进行计时。

time foo | bar

将为foobar命令计时(zsh将向您显示故障情况)。它在 shell 的 stderr 上报告它。

time foo.sh > bar.txt

bar.txt会告诉你打开和运行所需的时间foo.sh

如果要重定向time的输出,则需要在启动的stderr上下文中重定向,如下所示:time

{ time foo.sh; } 2> bar.txt

这:

2> bar.txt time foo.sh

也可以工作,但是与ksh93and一起使用bash,因为它不在第一个位置,time所以不被识别为关键字,所以time 命令而是使用(您可能会注意到不同的输出格式,并且它不会对管道进行计时)。

foo.sh请注意,两者都会重定向 time 的输出和to的错误bar.txt。如果您只想要时间输出,您需要:

{ time foo.sh 2>&3 3>&-; } 3>&2 2> bar.txt

请注意,POSIX 没有指定time行为是作为关键字还是内置的(无论是对管道还是单个命令进行计时)。因此,为了便于移植(如果您想在sh脚本中使用它并希望移植到不同的类 Unix 系统),您可能应该编写它:

command time -p foo.sh 2> bar.txt

foo.sh请注意,除非您启动单独的 shell,否则您无法单独对函数或内置函数或管道进行计时或重定向错误,如下所示:

command time -p sh -c 'f() { blah; }; f | cat'

但这意味着时间还将包括该额外的启动时间sh

答案2

并非所有版本的 time 都支持 -o 和 --output 参数。

您将需要像这样运行命令:

(time script.sh) 1> /dev/null 2> /tmp/logFile

这会将 script.sh 的输出放入 /dev/null 并将结果放入 /tmp/logFile。

如果您希望 STDERR 和 STDOUT 都进入日志文件,您可以像这样运行它:

(time script.sh) &> /tmp/logFile

答案3

/usr/bin/time输出到stderr,因此您需要重定向它。

/usr/bin/time foo.sh 2>bar.txt

如果您使用 bash 的time内置函数,则需要以不同的方式编写它:

(time ls) 2>bar.txt

或者,GNUtime支持一个--output参数:

/usr/bin/time --output bar.txt foo.sh 

答案4

要获取文件中的输出ls和输出:time

(time ls) &> log

time要仅获取文件中的输出:

(time ls) 2> log

相关内容