水底

ScalaとかC#とかk8sとか

複数のコマンドの出力をまとめてリダイレクトする2つの方法

1. (), {} の利用

(), {} で囲んでまとめてリダイレクト先を指定する. 丸括弧の場合はサブシェルで, 波括弧の場合はカレントシェルで実行される.

{
  command1
  command2
} >> log 2>&1

2. exec の利用

exec は現行プロセスを別コマンドのプロセスに置換するコマンドである. このとき, 引数を省略してリダイレクトのみ記述することで現行プロセス (shell) のリダイレクト先を上書きすることができる.

exec >> log 2>&1
command1
command2

ちなみに元に戻す方法が見当たらないけどどうやるのだろうか… (exec 1>&1 2>&2 とかで戻ってくれても良さそうだがうまくいかない)

まとめ

exec を使うと副作用が怖いので {} (or ()) でまとめてリダイレクトの方が無難っぽい (?)