ラズベリーパイをコマンドラインで操作することに慣れてくると、うっかり大切なファイルを上書きしたり削除したりしてしまうことが起こるようになるものです。
Linuxのコマンドには、それを防止するオプションがありますが、ファイルへのリダイレクトに対しては効果がないので、別の設定をしておく必要があります。
大切なファイルを消してしまう前に、しっかり設定しておきましょう。
リダイレクトの失敗とは
今ここに、important.txtというファイルがあるとしましょう。
そして、このファイルには大切な情報が書かれているとします。
rmやcp, mvといったコマンドで、大切なファイルを誤って消してしまわないために、以下の記事でオプション設定を行うべきということを書きました。
スポンサーリンクいずれも、”-i”オプションを付けることで、既存のファイルに対する操作を本当に実行してよいかどうか問い合わせるようにするのでした。
しかし、これらのオプション設定は、リダイレクトには効果がありません。
リダイレクトとは、
- コマンド > ファイル名
という書き方で、コマンドを実行した結果を、ファイル名で指定したファイルに書き込むことでした。
例えば
1 | $ echo "aaa" > important.txt |
といった操作です。echoコマンドの出力”aaa”が important.txt に書き込まれるのでした。
この操作で、もしファイル名に上記の大切なファイル名を書いてしまうと、大切なファイルに対して誤ってリダイレクトしてしまうことになり、もとのファイルの内容は消えてしまいます。
気をつけていれば防げそうですが、コマンドをたくさん操作するようにやると、このような上書きはよくやってしまいがちです。
やはりここは、”-i”オプションのように、あらかじめ防止する設定をしておきたいものです。
bashでは set -o noclobber を設定して誤操作を防ごう
リダイレクトに対しては、この設定を事前にやっておけばOKです。
ただし、Bashを使用しているという前提です。
Raspbian をインストールしたあと、特にログインシェルを変更していなければ、Bashを使用しているはずです。
ファイル ~/.bashrc をエディタで開き、以下の設定を書いておきます。
1 | set -o noclobber |
.bashrcの中であれば、どの場所でも構いません。
書いたら、保存して終了し、
1 | $ source ~/.bashrc |
を実行しておきます。
これで、先ほとど同じことをやってみましょう。
1 2 | $ echo "aaa" > important.txt bash: important.txt: 存在するファイルを上書きできません |
今度は上記のようにエラーがでて、リダイレクトできないようになります。
上書きを許可するには
このnoclobber設定をした環境下で、一時的に上書きを許可したいこともあります。
この場合は、リダイレクトで使用する”>”の代わりに”>|”を使用します。
1 | $ echo "aaa" >| important.txt |
これは元の通り、エラーが出力されなくなります。
縦棒は、パイプ処理を行うときに使う”|”です。
追加上書き”>>”に対しては、”>>|”でOKです。
“set +o noclobber”とやって、リダイレクトの上書き禁止の設定を解除することもできますが、ここでは省略します。
早速設定しておきましょう。