解説
「>」と「>>」は何が違う?ファイルへの上書きと追記を安全な練習先で比べよう
コマンドの結果を保存するつもりで、前にあった内容が消えた。「>」と「>>」で、すでにあるファイルの扱いが違うことを知っておこう。

コマンドの結果を保存するつもりで、前にあった内容が消えた。「>」と「>>」で、すでにあるファイルの扱いが違うことを知っておこう。
Bashとprintf、catを使える環境で、空の練習フォルダーを用意する。本当のログや原稿と同じ名前は使わず、掲載する練習用ファイルだけで試してね。
>は、通常は内容を置き換える
mkdir redirect-practice
cd redirect-practice
printf 'first\n' > note.txt
printf 'second\n' > note.txt
cat note.txt
通常の設定なら、最後に表示される内容はsecondの一行。二回目の>が、もともとのfirstへ追記したのではなく、内容を書き直したためだよ。
すでにある同名フォルダーへ入って実行しないようにしよう。練習先が作れなかったら、そのまま続けず、別の新しい名前へ変える。
>>は、後ろへ足す
printf 'first\n' > note.txt
printf 'second\n' >> note.txt
cat note.txt
今度はfirstとsecondの二行になる。>>は、既存の内容の後ろへ出力を追加するためのリダイレクトだよ。ファイルがなければ作成される。
編集部では、新しいBashの練習環境で、この一行・二行の結果を実行して照合した。普段のファイルへ同じ操作を行ったものではないよ。
改行まで自動で補うわけではない
printf 'A' > joined.txt
printf 'B' >> joined.txt
cat joined.txt
この例の内容はAB。>>はファイルの後ろへ書くが、自動で行を分ける指定ではない。printfの文字列に改行があるかどうかで、見た目も変わるんだ。
| 指定 | 既存ファイルの基本的な扱い |
|---|---|
| > | 通常は内容を切り詰めて書く |
| >> | 内容の後ろへ追加する |
コマンドが失敗したら、元の内容は残る?
リダイレクトの準備は、コマンド本体の実行より前に行われる。>でファイルが開かれたあと、プログラムが失敗したり何も出力しなかったりしても、元の内容が保たれる保証はない。
大切なファイルへ直接向けず、別の新しい保存先へ出して中身を確かめる設計も考えよう。何を戻したいかがあるなら、実行前に控えと復元方法を用意する。
設定の違いと、出力の種類も見る
Bashのnoclobberなどの設定により、既存ファイルへの>が拒否される場合もある。ただし、その設定がどの端末にも入っているとは限らない。保護があるつもりで、確認を省かないようにしたいね。
また、この例で向けているのは標準出力。エラーの出力先まで全部同じファイルへ入るとは限らないので、必要な出力の種類も分けて確認しよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。