我可以将时差命令的输出写入文件吗?
例如,我尝试过:
$ time foo.sh > bar.txt
但它只将 foo.sh 的输出提供给 bar.txt。
答案1
在许多 shell 中,包括ksh
,zsh
和bash
,time
是一个关键字,用于对管道进行计时。
time foo | bar
将为foo
和bar
命令计时(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
也可以工作,但是与ksh93
and一起使用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