【发布时间】:2009-05-13 15:16:14
【问题描述】:
我想在 bash 中运行一个进程,并将运行所花费的秒数保存在一个环境变量中。 我该怎么做?
【问题讨论】:
我想在 bash 中运行一个进程,并将运行所花费的秒数保存在一个环境变量中。 我该怎么做?
【问题讨论】:
您是要将此代码放入您的脚本中,还是从启动脚本的进程中执行?
对于后者,您可以使用“时间”保留字,然后解析它返回的内容以获取脚本所花费的时间。
如果您想在脚本中执行此操作,您可以将变量 SECONDS 设置为零,此后每次引用该变量时,它都会更新为经过的秒数。因此,您可以将“SECONDS=0”放在脚本的最开始,并且当您需要经过的时间时,它将在 SECONDS 变量中。
您也可以在命令行中使用 $SECONDS 技巧,例如:
$ SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"
时间保留字和 SECONDS 变量都记录在 bash 手册页中。
【讨论】:
这适用于 Bash,也适用于 Zsh:
# Set time format to seconds
TIMEFORMAT=%R
# Time a process
PROC_TIME=$(time (insert command here >/dev/null 2>&1) 2>&1)
echo $PROC_TIME
【讨论】:
rtime(){ TIMEFORMAT=%R; echo $(time ("$1" 2>&1) 2>&1) } .... 和后来的...echo $SECONDS - 这是魔法™... 我使用它所有时间 i>.
使用GNU time,
\time -p -o time.log $COMMAND
然后阅读time.log。
(使用\time 或command time,否则您将使用Bash 的time 内置,它不支持这些选项。)
即使$COMMAND 打印到 stderr(这会混淆 Oli 的答案)并保留 stdout/stderr(Farzy 的答案不会),这也将起作用。
-o ... 告诉time 将其输出发送到文件而不是标准错误(默认情况下),-p 生成传统的
real 0.00
user 0.00
sys 0.00
而不是 GNU 时间的默认值
0.00user 0.00system 0:00.01elapsed 8%CPU (0avgtext+0avgdata 0maxresident)k
80inputs+0outputs (1major+188minor)pagefaults 0swaps
【讨论】:
在cron 运行的脚本中使用$SECONDS 对我不起作用(尽管当我直接运行它时它起作用了;我今天第一次使用cron,所以也可能存在一些用户错误)。 @Farzy 使用TIMEFORMAT 的回答有效,但我不想重定向定时命令的输出。如果您处于类似情况,可以使用 $SECONDS 的替代方法:
start=$(date +%s)
your_command
seconds=$(($(date +%s) - $start))
【讨论】:
使用时间命令。请注意,bash 版本的 time 与 /usr/bin/time 不同。所以你会有类似的东西:
TIME=`/usr/bin/time --format="%e" your_command_here >/dev/null`
该格式只是将“实时”时间值提取出来。如果您想做的不仅仅是显示它,则需要将其从字符串转换。
如果您只想导出字符串,请使用export。
【讨论】:
$TIME实际上是/usr/bin/time使用的,所以最好选择一个不同的变量名。避免此类冲突的一种方法是不要为您自己的变量使用全部大写的名称。