グループコマンドによる標準出力のリダイレクト

複数のコマンドの出力を同じファイルに出力する場合、グループコマンドの使用が推奨される。

例えば以下のように2つのコマンドが標準出力に出力する場合:

echo foo >> test.txt
echo bar >> test.txt

グループコマンド({})で以下のようにまとめてリダイレクトできる。

{
  echo foo
  echo bar
} >> test.txt

ファイルアクセス回数

グループコマンドを使用すると、ファイルへのアクセス回数を減らせる。

  • 個別リダイレクト: コマンドごとに開いて追記
  • グループコマンド: ファイルを1回だけ開いて追記

可読性

グループコマンドを使用すると、場合によってはコードをより簡潔にできる。

例えば以下のように複数のコマンドが同じファイルに出力する場合:

command1 >> file.txt
command2 >> file.txt
command3 >> file.txt
...

上記のように書くと同じファイル名が繰り返されて冗長となる。

グループコマンドを使用すると、以下のようにまとめて書ける。

{
  command1
  command2
  command3
} >> file.txt

ShellCheckによる推奨

ShellCheckでも複数コマンドが標準出力に出力する場合はグループコマンドの仕様を推奨している。
» ShellCheck: SC2129

SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.

while, forブロックでも使える

whileブロックやforブロックもグループコマンドと同様にまとめてリダイレクトできる。

ファイルを読み込みながら結果をまとめて出力する場合:

while read line; do
  echo "Processing: $line"
done < input.txt >> output.txt

forで連番を生成してファイルに出力する場合:

for i in {1..5}; do
  echo "Number: $i"
done >> numbers.txt