我想记录命令的执行时间。像这样的东西:
#!/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