やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

ターミナルはFinderやエディタから削除したフォルダを参照し続けてしまう。

$ mkdir dev-trash

$ cd dev-trash

dev-trashをルートとして考えてみる。

ルート直下にfooディレクトリと、以下のファイルhello_generator.rbを作る

file = File.open("foo/generated_hello.txt", "w")
file.puts "hello"

このファイルを実行すると、fooの下にgenerated_hello.txtファイルを生成する。

$ ruby hello_generator.rb

ここで、新しいターミナル2を開いて、generated_hello.txtを確認してみる。

$ cd dev-trash/foo

$ cat generated_hello.txt

すると、以下のようになる。

hello

ここで、Finderもしくはエディタからfooを削除する

fooは削除したにも関わらず、

$ cat generated_hello.txt

とすると、

hello

が表示される。

次にhello_generator.rbの内容を変更する。

file = File.open("foo/generated_hello.txt", "w")
file.puts "goodbye"

そして実行。

$ ruby hello_generator.rb

ターミナル2から、generated_hello.txtの内容を確認してみると、

goodbyeになっているはずだが・・・

実際は hello のまま。

ファイルのハッシュを調べてみる。

ターミナル2にて。

$ md5 generated_hello.txt

MD5 (generated_hello.txt) = c157a79031e1c40f85931829bc5fc552

ターミナル1からも確認する

$ md5 generated_hello.txt

MD5 (generated_hello.txt) = d92a12b93565fce571081b028e361e01

どうやら、ターミナル1とターミナル2が指している同じパスのファイルは、別のもののようだ。

実際、ターミナル1から確認すると、

$ cat generated_hello.txt

goodbye

と正常に生成されている。

つまり、ターミナル2から参照しているファイルは、生成されたファイルとは別のファイルということになる。

$ pwdなどで調べてみても、パスは同じなので同じファイルじゃないのー!?と困惑したけど、どうやらパスというのは絶対的なものではないらしい。

これはターミナル2がゴミ箱に移動したファイル(フォルダ)を参照し続けていたことが原因だった。

ちなみに、ターミナル2から

$ cd ../foo

$ cat generated_hello.txt

とすると、

goodbye

と正常なファイルが参照し直される。

$ rmコマンドを使用すると、ゴミ箱に行かずに削除されるから、そもそも参照ができないので、ファイルがなければエラー、あれば新しいファイルが自動的に参照されるみたいだ。