Bash
記錄命令執行時間
我想記錄我的命令的執行時間。像這樣的東西:
#!/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
實用程序(基於您對-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