- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

飛躍してたりするのは、半分メモ程度に取っているからです。
徐々にまとめていきたいところです。

はじめに Edit

"rm -rf /"にしろ、C言語にしろ、旧来のシステムは、
省略的表記を許すことによる弊害を考慮していなさ過ぎるのではないかと。
その問題は、表記のコストと実行結果の価値(重要性)が
ずれている点にあると思うのです。

例えば、"rm -rf /"なんてのは、重大な損害を引き起こす割りに、
"rm -rf /work/*"なんかよりも実行コストが低いことに問題があると思うんですよ。

解決法の提案 Edit

で、肝心のこれらの解決には、「起こる前に回避する」、「問題が起こった後に解決する」かの2種類があると思います。

起こる前に回避する Edit

まず、「起こる前に回避する」というのを実際の例を上げて考えてみます。

実行コストと結果の重要性を一致させる Edit

例えば、"rm -rf ./work"、"rm -rf ./"、"rm -rf /"があった場合、
前者から後者に行くにしたがって簡単に入力できるのに、結果は重大な損害をもたらします。

以下のように変更してみます。

改善前改善後
./<cd>/
../<upper>/
/<root_directory_only>/
./work<cd>/work
../work<upper>/work
/work<root_directory>/work

「省略すると意味が違なるのは危険」
「危険度:ルートのみ > ルート > .. > . 」、
と考えた1例です。

"./"とか、"/"や"/work"のような省略的表記は無効になるようにします。
具体的には、/ のみや / から始まる指定ができないので、
たとえ"rm <cd>/"を"rm /"と間違って表記しても / が消されることはありません。

「ただコマンドを長くしただけ」、「冗長だ」、「面倒」という意見もありますが、
そんなものと、ちょっとした入力ミスで / をふっとばすのとは秤には掛けられません。

ただ、上の例でも改善の余地はあります。

  • "<cd>/work"を省略すると、"<cd>/"になって危険じゃないの?
    • "<cd>/work"、"<current_directory>/"とに分ける?
    • んじゃ、"<cd>/work/hoge"を省略すると、"<cd>/work"になって危険じゃないの?
      • 確かにそうだ……どうしよう(´д`;)
      • "<cd>///work//hoge/mage"、"<cd>//work/hoge"、"<cd>/work"とか?左から書く場合は、大丈夫っぽいけど……
      • いっそのこと、2階層以上表せられなくするとか……"<cd>/work/hoge"はNG。
      • やはり、片方から記述することを前提にして省略できないようにするのがスマートなのかな
      • いっそのこと、後ろから記述させるというのはどうか?"mage\hoge\work\<cd>"画期的?"\"は"/"の逆の意味
  • 面倒くささは、shellの補完で解決できるけど、それしちゃうと入力コストが同じになっちゃうから駄目ポ。
  • あと、ルートにいるときの.とか、ルートのひとつ上の時の..って危険だから、それも考慮しなくちゃいけないし…。
    • 「結果の重要性」は相対パスで決まるんでなく、絶対パスで決まるから、絶対パスに展開して判断しないと駄目
  • Windowsのエクスプローラーみたいに、システムフォルダはアクセスしにくいみたいにできないかな。警告画面をターミナル画面いっぱいに表示するとか。ディレクトリに移動するのに、何度も試行が必要とか(あと5回 cd が必要です、とか)

(改善案、考え中)

1つ閃いた。
省略のミスはディレクトリの選択中に起こる!!
選択中(=意図しないディレクトリを選んでいる状態)にコマンドが実行できているからいけない。
完全に選択するまでは、コマンドが実行できないようにすればよい。
ディレクトリ名は直接入力できないようにする。しても、無効。
ディレクトリ選択コマンド(もしくはキー)で、ディレクトリ選択メニュー出現。
選択後のディレクトリ名は表示させるがread onlyで編集不能。
というのは?
つーか、これってWindowsのソフトでよくあるダイアログでしかディレクトリ選択できないっつーやつでは。

ツールに重要な機能を持たせない Edit

つか、rmで / や ./ や ../を消せるのが問題。

remove_upper_directory, remove_current_directoryとか機能を分けてコマンドを作るべき。/ のみを消すのなんていらない。

それと、"rm -rf"も危険。"rm /test"と"rm -rf /test"じゃ点と地の違い。
force_recursive_remove とかにすべし。

つきつめると、オプションの全組み合わせにコマンドが必要になるから、
"_"でくぎってオプションをコマンドとして与えられるようにすると言うのはどうか。

危険を予測して、警告を出す Edit

"rm"自体がやばいので、実行のたびに警告を出すというのも手段の一つです。
しかし、これは、あまり意味がないのではと思います。

例えば一般に多い、"rm -i"のようにrmのエイリアスとして、警告を出すオプションを指定しておく方法がありますが、常に出すようにすると、慣れてしまって結局意味がありません。

また、Windowsで言えば、削除でゴミ箱に送る時にOKボタンを連打(もしくはENTER連打)してしまう人がいることに近いです。(挙句の果ては、ダイアログがウザイらしく、ゴミ箱に入れず直接 shift+DEL で削除する人もいるようです(もうアフォかと))

問題が起こった後に解決する Edit

undo, redo を可能にする。以前の状態を保存しておく等。

例:

  • Windowsのゴミ箱
  • PhotoShop, Edge等のツールの強力なUndo, Redo
  • PhotoShopのスナップショット機能
  • Windowsのシステムの復元(←これスゴイです、実際役に立ちました)

結論 Edit

いきつく先、というか根本的な問題は、あらかじめ性善説的に設計するか、性悪説的に設計するかの違いなんだと思うんですが。
省略的表記のうんぬんなんてのは、それらの問題の一部に過ぎないです。

そういやインターネットなんて、性善説の考えで作ったもんだから、今のこの有様なわけでー。

あれ、そういえば、wikiって性善説的だよなあ。
バックアップとれてるとはいえ、なんとかしないと…。

ああ、自分の場合、なるべく性悪説的に作りたいなー。
(でも、実際は、性善説的に作る方が圧倒的に楽なんだよなー)

ちなみに、誰も実際に"rm -rf /"とかやったなんて言ってませんので……。

※あああ、cd /; rm -rf hoe/ * やっちまった…
※後日、rm -rf /work/hoge / やっちまいました(hogeの後に空白スペース入れたorz)

参考リンク Edit


  • なんでもかんでも、rootで作業しなければいいだけでは? お書きになられている通り、WindowsはすばらしいOSだと思うので誤操作で取り返しがつかなくなるUNIXなんか使わずにWindowsだけ使われるのがよろしいかと。 -- 通りすがり? 2008-06-10 (Tue) 11:37:24
  • LAMPなどWindowsだけででは面倒なことも山ほどあるので、そうもいかないのですよね。
    Windowsでもcygwinなど使ってますので実は状況は変わりません。前にメインのデータのあるドライブ以下をふっ飛ばしそうになったことがありますw
    ちなみに、今は unixでもrootじゃなくて sudo 使いますし(この記事書いたのはsudo知らない時でけっこう古い話なのです)、
    unixでも、rmは使わずに mvで/tmpに放り投げてます。
    rm -rf / な2chのスレとかもあるんですがいまいち閑古鳥で、こういったことを回避する定番の方法が見つからないでいます。
    まとめますと、みんなどうやって回避してんの?ってことです。はい。
    (掲示板なんかで聞くと、ネタ?とか言われたり、馬鹿?とか言われたり、まともに取り合ってくれない……この話題 orz) -- TOBY 2008-06-10 (Tue) 12:30:15
  • せっかくなので参考リンク追加してみました -- TOBY 2008-06-10 (Tue) 13:08:18


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2008-06-10 Tue 13:08:19 JST (3301d)