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
\第一線のプログラマーの行動原理を学べる!/