bash リダイレクションによる上書き禁止

何かコマンドからの出力を簡単にファイルに残しておけるので、リダイレクトは良く使います。しかし、たまに大事な既存ファイルに上書きしてしまって失敗することがあります。そんな「よくあるリダイレクトミス」を防ぎましょう!

リダイレクトで上書き禁止する場合は、setコマンドで「noclobber」をシェルの設定としてセットしておきます。以降、ファイルは’>’で上書きできなくななります。ただし、追記「>>」は可能です。上書きが必要な場合は「>|」で上書きできるようになります。設定を元に戻す場合は、同様に、setコマンドで「noclobber」をシェルの設定をoffにします。

リダイレクト禁止の設定

リダイレクトによる上書き禁止する場合は、setコマンドで「noclobber」を以下のようにセットします。

1: $ set -o noclobber

このとき、シェルの設定は「noclobber」がonになります。

1: $ set -o
2: ...
3: noclobber          on
4: ...

リダイレクト禁止の動作

この場合、既存ファイルにリダイレクトしようとすると、エラーが発生して上書きされません。

1: $ cat aaa.txt
2: aaa
3: 
4: $ echo "hello" > aaa.txt
5: bash: aaa.txt: 存在するファイルを上書きできません
6: 
7: $ cat aaa.txt
8: aaa

追記は有効です。

1: $ cat aaa.txt
2: aaa
3: 
4: $ echo "hello" >> aaa.txt
5: 
6: $ cat aaa.txt
7: aaa
8: hello

強制的に上書きする

リダイレクト禁止で「noclobber on」のとき、既存ファイルに強制的に上書きする場合は、「>|」を使います。

1: $ cat aaa.txt
2: aaa
3: 
4: $ echo "hello" >| aaa.txt
5: 
6: $ cat aaa.txt
7: hello

リダイレクト禁止の設定を元に戻す

リダイレクトによる上書き禁止を元に戻す場合は、setコマンドで「noclobber」を以下のようにセットします。

1: $ set +o noclobber

このとき、シェルの設定は「noclobber」がoffになって上書き可能になります。

1: $ set -o
2: ...
3: noclobber          off
4: ...

まとめ

  • リダイレクト禁止の設定は「set -o noclobber」、戻す場合は「set +o noclobber」
  • リダイレクト禁止がセットされても、追記「>>」は可能。
  • 強制的に上書きする場合は、「>|」を使う。