bash(sh)のビルトインコマンド time の出力がどうしてもリダイレクトできなくて困ってた。
たとえば、サービスのバックアップをとるスクリプトの時間を計測して、それを記録したい場合、timeの出力は標準エラー出力にでるので、
% time backup-service.sh 2> log
とやればいいように思えるが、これではうまくいかない。なぜなら
time が bash のビルトインコマンドであるために、backup-service.sh 2> log が先に評価されてしまうのであった。参考: Redirecting output of the bash keyword time
コマンド版の time を使うと、正常にリダイレクトできる
% /usr/bin/time backup-service.sh 2> log
で、結局どうすればよいかというと、{ COMMANDS ; } というコマンドのグルーピングで評価順を変えてやればよい、ということらしい。具体的には
% { time backup-service.sh; } 2> log
とすると期待通り log に time ビルトインコマンドの結果が書き込まれる
おまけ:ビルトインコマンドのヘルプを見るには
ビルトインコマンドは man でマニュアルが見れないので、いつも man bash で bash のマニュアルを開いてから、該当するコマンドの説明を検索していたが、% help for
など、(これもビルトインコマンドである)help で説明を見られることが判明。。。うー、もっと早く知りたかった。。。
グルーピングコマンドである { } の説明を見たければ、
% help { { ... }: { COMMANDS ; } Run a set of commands in a group. This is one way to redirect an entire set of commands.
とでてくる。便利。