複数のコマンドの出力をまとめてリダイレクトする2つの方法
1. ()
, {}
の利用
()
, {}
で囲んでまとめてリダイレクト先を指定する. 丸括弧の場合はサブシェルで, 波括弧の場合はカレントシェルで実行される.
例
{ command1 command2 } >> log 2>&1
2. exec
の利用
exec
は現行プロセスを別コマンドのプロセスに置換するコマンドである. このとき, 引数を省略してリダイレクトのみ記述することで現行プロセス (shell) のリダイレクト先を上書きすることができる.
例
exec >> log 2>&1 command1 command2
ちなみに元に戻す方法が見当たらないけどどうやるのだろうか… (exec 1>&1 2>&2
とかで戻ってくれても良さそうだがうまくいかない)
まとめ
exec
を使うと副作用が怖いので {}
(or ()
) でまとめてリダイレクトの方が無難っぽい (?)