Bash

記錄命令執行時間

  • October 22, 2017

我想記錄我的命令的執行時間。像這樣的東西:

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

問題是時間會產生污染標準錯誤的子程序。這可以在沒有這種副作用的情況下完成嗎?

如果您使用/usr/bin/time,那麼將定時程序的 stderr 和時間資訊發送到不同通道的唯一方法是告訴time實用程序執行此操作。您不能在呼叫的 shell 中使用重定向來做到這一點,time因為定時程序的 stderr 和time自身的輸出被發送到同一個文件描述符。

您正在使用的time實用程序(基於您對-fGNU 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

引用自:https://unix.stackexchange.com/questions/399779