コマンド実行時間を記録したい。このような:
#!/usr/bin/env bash
echo "$@" >> /tmp/times
exec 3>&2
(/usr/bin/time -f "%e" "$@" 2>&3) 2>>/tmp/times
問題は、時間が経つと標準エラーを汚染するサブプロセスが生成されることです。副作用なしにできますか?
答え1
を使用している場合、/usr/bin/time
時間が指定されたプロセスの標準エラーと時間情報を別のチャネルに送信する唯一の方法は、ユーティリティにそのように指示するtime
ことです。time
タイマープロセスのstderrと独自の出力はtime
同じファイル記述子に送信されるため、リダイレクトを使用して呼び出しシェルでこれを行うことはできません。
使用しているユーティリティtime
(用途に応じてGNU coreutils)には、他のファイルに書き込んでそのファイルに追加するように指示する-f
オプションがあります。このオプションはFreeBSDとmacOSにもあります。-o
-a
#!/bin/sh
echo "$@" >>/tmp/times
exec time -f %e -a -o /tmp/times -- "$@"
あるいは、shellキーワードを使用することもできます(bash、ksh、およびzshを含むこのキーワードを含むシェルから)。キーワードを使用すると、時間指定プロセスの一部としてリダイレクトを指定できるため、時間情報がリダイレクトされる場所を制御できます。
#!/bin/bash
echo "$@" >>/tmp/times
TIMEFORMAT='%R'
{ time "$@" 2>&3; } 3>&2 2>>/tmp/times