【Bash】forループ中の出力をまとめてファイルにリダイレクトする方法

forループ中で実行するコマンドの出力を、ファイルにリダイレクトしたい場合があります。

でも、以下のようにコマンドごとにリダイレクト先(下記の例では「>> mirai.txt」)を書くのは面倒ですよね。

#!/bin/bash
echo -n > mirai.txt
for i in {1..100}
do
  echo ${i}分後 >> mirai.txt
  date -d "${i} minutes" '+%Y/%m/%d %H:%M:%S' >> mirai.txt
done

こんな時は、コマンドごとにリダイレクトするのではなく、ループ中の出力をまとめてファイルにリダイレクトしたほうが良いでしょう。
まとめて出力したほうがコマンドごとにリダイレクトを書くより簡単ですし、実行速度も早くなります。

#!/bin/bash
for i in {1..100}
do
  echo ${i}分後
  date -d "${i} minutes" '+%Y/%m/%d %H:%M:%S'
done > mirai.txt

上記はシェルスクリプトに書く例ですが、for以降をそのまま端末に貼り付けて実行することもできます。なお、1行で書く場合は以下のようになります。

for i in {1..100}; do echo ${i}分後; date -d "${i} minutes" '+%Y/%m/%d %H:%M:%S'; done > mirai.txt

実行すると、「mirai.txt」の内容は以下のようになります(時刻は実行した環境次第)。

1分後
2017/11/14 14:41:53
2分後
2017/11/14 14:42:53
3分後
2017/11/14 14:43:53
4分後
2017/11/14 14:44:53
5分後
2017/11/14 14:45:53
6分後
2017/11/14 14:46:53
7分後
2017/11/14 14:47:53
8分後
2017/11/14 14:48:53
9分後
2017/11/14 14:49:53
10分後
2017/11/14 14:50:53
(以下略)