スクリプトがあります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