2013年04月13日 01:30 [Edit]

私みたいなおっちょこちょいを自滅から救って来たちょいとした工夫x3+1

ぎゃああぁぁぁ

僕がMacのホームディレクトリを削除するに至った経緯と、復元するまでの道のり | CreativeStyle
具体的に何をしたのか。それは、以下のコマンドの実行です。
$ rm -rf ~/

でもこれ、すごいやりがち。

やりがちなのになんでそれよりおっちょこちょいなはずな私がもう30年近くものあいだ難を逃れているかを披露しておくことにする。


以下、それぞれtcsh版とbash版を。zsh版はどなたかよろしく。

alias

上記の例は、実はこれだけで防ぐことが出来ていた。

tcsh
alias rm 'rm -i'
bash
alias rm='rm -i'

要するに、rmと打ったらrm -iを意味するようにしておくわけだ。iなきrmは、依然\rm(頭にbackslash)ないし/bin/rm(full path)でアクセスできるので、こうすることによって不意なファイル削除を未然に防ぐことができる。同様の設定は、mvにも施しておいた方がよいだろう。

その歴史は古く、tなしのcshまで遡れる。tcshが出たのが私が大学生だった時代で、その頃の.cshrcにはすでにこの設定をしていたのをよく覚えている。

noclobber

ファイルを不用意に損なうリスクは、rmmvといったファイル操作以外にもある。シェルのリダイレクトだ。たとえば

% cat foo >> bar

のつもりで

% cat foo > bar

と打ってしまったらどうだろう。barに元々あった情報はfooの中身で完全に置き換わってしまう。これはaliasでは防げない。

それを防いでくれるのが、noclobberオプション(bash)/shell変数(tcsh)。

tcsh
set noclobber
bash
set -o noclobber

こうしておくことで、ファイルが存在した場合エラーで止まってくれる。

% date > foo
% date > foo
foo: File exists.

本当に上書きしたい時には、bashでは>|、tcshでは>!>の代わりに使うだけだ。

su(do)?時の工夫

ユーザーより怖いのは、スーパーユーザー。

上記の例ではホームディレクトリーで済んだが、仮にsuしていた状態で

$ rm -rf /

としてたらどうなるか?昨今のrmはこれを特例として扱う場合が多いそうだけれども、そうとは限らない上、恐ろしいことにこれはホームディレクトリーをバルスするより一文字も短い。

自分がスーパーユーザーであることを見落とさないように、私はいくつか工夫している。

まず、プロンプトをユーザー時とスーパーユーザー時に変えている。

dankogai@dan-imac122[1024]:~% sudo -s
Password:
root@dan-imac122[1025]:~#

おっさんゆえプロンプトはユーザー名を変えて太字にしているだけだが、赤くするなり反転するなりもっとどぎつい設定にしておいてもよいかもしれない。

さらにスーパーユーザーでない時には{,/usr,/usr/local}/sbinPATHに入れないようにしている。sudoのおかげでいちいちスーパーユーザーにsuしなくともスーパーユーザー権限が使えるようになったのはよいけれども、これはかえって心の切り替えがないということで危なくもある。こうしておくことで、sudoで通常ユーザーからスーパーユーザーコマンドを発行する際もフルパスを入力しなければならず、危険を未然に防ぐことができるし、補完があるおかげで面倒臭さもそれほどない。

おまけ

tcshもbashも、ワイルドカードをctrl-X+*で展開できる。

% rm *ctrl-X + shift-8
↓
% rm homura kyoko madoka mami sayaka

まとめ

「Unixという考え方」
UNIXシステムは、初心者にピストルどころか突撃銃を押しつけ、20発の弾を込めた上で、銃口を足に向けさせてやる

けだし名言。とはいえこの突撃銃には一応安全装置がついているのである。早めに使い方を覚えておこう。自分の頭や心臓をぶちぬく前に。

Dan the Unix User for 0x20 Years


この記事へのトラックバックURL

この記事へのトラックバック
私みたいなおっちょこちょいを自滅から救って来たちょいとした工夫x3+1 http://blog.livedoor.jp/dankogai/archives/51863725.html 2番目のnoclobberは知らなかったので参考になったけれど、その他の点でツッコミ・思うところがあったので書いてみる。 alias rm=’rm -i’は
[shell]無慈悲なshellから自分を救う工夫(というかクセ)【auientが調べたこと】at 2013年04月13日 13:12