- Home
- linuxに関すること
- bash リダイレクションによる上書き禁止
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」
- リダイレクト禁止がセットされても、追記「>>」は可能。
- 強制的に上書きする場合は、「>|」を使う。