timeコマンドの実行結果がファイルに出力できない

以下のように実行するとtimeコマンドで出力される経過時間がファイルに出力されない。

$ time ls > ls.txt
ls -G > ls.txt  0.00s user 0.00s system 56% cpu 0.003 total

$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt

ターミナルへ経過時間が表示されてしまいファイルへ出力されていない。

timeコマンドで出力される経過時間は標準エラー出力に出力される。 そのためリダイレクトで標準出力をファイルに出力してもtimeコマンドの実行結果はファイルに出力されない。

ただし標準エラーを含めてファイルへ出力するために以下のように実行してもtimeコマンドの実行結果はファイルに出力されない。

$ time ls > ls.txt 2>&1
ls -G > ls.txt 2>&1  0.00s user 0.00s system 52% cpu 0.008 total

$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt

同様にターミナルへ経過時間が表示されてしまいファイルへ出力されていない。

timeコマンドの実行結果をファイルに出力する場合はカッコで囲む

time ls > ls.txt 2>&1というコマンドをシェルはls > ls.txt 2>&1というコマンドに対してtimeコマンドを実行すると解釈する。
そのためあくまでもlsコマンドの実行結果をファイルに出力し、全体の実行時間をターミナルへ出力する。

timeコマンドの実行結果をファイルに出力するにはtime lsを明示的にグルーピングして以下のようにする。

$ { time ls; } > ls.txt 2>&1
$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 55% cpu 0.003 total

{ time ls; }というグルーピングを使うことでtimeコマンドの実行結果をファイルに出力できる。

また()を使用して以下のように実行しても同様にtimeコマンドの実行結果をファイルに出力できる。

$ ( time ls ) > ls.txt 2>&1
$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 55% cpu 0.003 total

{}()を使うことでtimeコマンドの実行結果をファイルに出力できる。

パイプする場合も同様にカッコで囲む

以下のようにtimeコマンドの実行結果をファイルに出力する場合もうまくいかない。

$ time ls 2>&1 | tee ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G 2>&1  0.00s user 0.00s system 53% cpu 0.005 total

$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt

標準出力には時間経過が表示されるが、ファイルには出力されない。

以下のように{}()で囲むとtimeコマンドの実行結果をファイルに出力できる。

$ { time ls; } 2>&1 | tee ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 53% cpu 0.005 total

$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 53% cpu 0.005 total
$ ( time ls ) 2>&1 | tee ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 53% cpu 0.005 total

$ cat ls.txt
a.txt
b.txt
c.txt
d.txt
e.txt
ls -G  0.00s user 0.00s system 53% cpu 0.005 total