sev*_*evo 6 bash io-redirection time-utility
我想记录我的命令的执行时间。像这样的东西:
#!/usr/bin/env bash
echo "$@" >> /tmp/times
exec 3>&2
(/usr/bin/time -f "%e" "$@" 2>&3) 2>>/tmp/times
Run Code Online (Sandbox Code Playgroud)
问题是时间会产生污染标准错误的子进程。这可以在没有这种副作用的情况下完成吗?
如果使用/usr/bin/time,则将定时进程的标准错误和时间信息发送到不同通道的唯一方法是告诉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 -- "$@"
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用 shell 关键字(在具有它的 shell 中,包括 bash、ksh 和 zsh)。使用关键字,您可以控制时间信息经过重定向的位置,因为您可以将重定向指定为定时过程的一部分。
#!/bin/bash
echo "$@" >>/tmp/times
TIMEFORMAT='%R'
{ time "$@" 2>&3; } 3>&2 2>>/tmp/times
Run Code Online (Sandbox Code Playgroud)