stdout/stderr をログファイルにリダイレクトできません。 [重複]

stdout/stderr をログファイルにリダイレクトできません。 [重複]

スクリプトがありますtmp.sh

#!/bin/bash

echo hello
sleep 3
echo 3

スクリプトの実行時間(およびスクリプトの標準出力)をログファイルに記録したいと思います。

user$ time ./tmp.sh >& log.tmp

real    0m3.003s
user    0m0.000s
sys     0m0.003s

動作しません。

user$ time ./tmp.sh 2>&1 log.tmp
hello
3

real    0m3.003s
user    0m0.002s
sys     0m0.001s

これも機能しません。

timeコマンド出力をログファイルに書き込む正しい方法は何ですか?

答え1

組み込みtimeコマンドbashは、コマンド(実際のコマンド)が返された後にSTDERRにタイミング情報を表示します。したがって、それらをグループ化してグループのSTDERRをファイルに渡さないと、実際のコマンドのSTDERRのみがファイルにリダイレクトされ、コマンドが返されるとtime(情報が表示される前に)ファイルが閉じられます。

コマンドのグループ化を使用して、STDOUTとSTDERRをリダイレクトできます。

{ time ./tmp.sh ;} &>log.tmp  

またはサブシェルで実行します。

( time ./tmp.sh ) &>log.tmp

例:

$ { time sleep 1 ;} 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s


$ ( time sleep 1 ) 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s

関連情報