![stdout/stderr をログファイルにリダイレクトできません。 [重複]](https://linux33.com/image/6822/stdout%2Fstderr%20%E3%82%92%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%20%5B%E9%87%8D%E8%A4%87%5D.png)
スクリプトがあります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