记录命令执行时间

记录命令执行时间

我想记录命令的执行时间。像这样的东西:

#!/usr/bin/env bash
echo "$@" >> /tmp/times
exec 3>&2
(/usr/bin/time -f "%e" "$@" 2>&3) 2>>/tmp/times

问题是时间产生了污染标准错误的子进程。这可以在没有副作用的情况下完成吗?

答案1

如果您使用/usr/bin/time,则将定时进程的 stderr 和时间信息发送到不同通道的唯一方法是告诉time实用程序执行此操作。您无法在调用的 shell 中使用重定向来完成此操作,time因为定时进程的 stderr 和自身的输出time被发送到同一文件描述符。

您正在使用的实用time程序(根据您对 的使用情况-f,它是 GNU coreutils)有一个选项-o可以告诉它写入不同的文件,并附-a加到该文件。 FreeBSD 和 macOS 上也存在此选项。

#!/bin/sh
echo "$@" >>/tmp/times
exec time -f %e -a -o /tmp/times -- "$@"

或者,您可以使用 shell 关键字(在具有该关键字的 shell 中,包括 bash、ksh 和 zsh)。使用关键字,您可以控制时间信息经过重定向的位置,因为您可以将重定向指定为定时过程的一部分。

#!/bin/bash
echo "$@" >>/tmp/times
TIMEFORMAT='%R'
{ time "$@" 2>&3; } 3>&2 2>>/tmp/times

相关内容