Wednesday, July 6, 2011

Terminal (Shell) on Mac OSX or Unix continues to show a folder even if it is deleted or renamed

I have logged this defect with Apple. But since then I have only been told it is legacy Unix behavior. And Unix is supposed to behave that way. In any case, I find it valuable to share this now.

-------------------------------------------------------------
This is already present on Apple Website since 19th March 2010 and has one response in addition to the emails. Read Further Apple Mac OSX Bug By Anwar Faiz.
-------------------------------------------------------------
Make a folder, let us say "xyz" on desktop and cd to this location on a terminal using 'cd' command.
Now rename that folder to "abc".
Now type 'ls' command on Terminal to see the content of folder "xyz", it still shows.
In addition if you use 'pwd' command, it still shows that you are in directory "xyz"
Worse is that even if you delete the folder "xyz" and empty trash. Even then using 'pwd' command would show your present working directory as "xyz" folder.
--------------------------------------------------------------


I got a detailed response for this. The same can be read over at same Apple Official website also. I am thankful to Mr. Bob Harris from New England, USA, who took time to explain.:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
All expected behavior.

The 'cd' command makes a chdir() system service call, which opens the target directory and stores the open file descriptor in the process.

When you rename the folder, that just changes the directory entry in its parent folder, it does not change the file system inode for the directory nor does it affect already open file descriptors to the directory.

So when you do an 'ls' with no path, the 'ls' command will ask the file system for the '.' (current directory), which the file systems knows to use the current working directory it already has saved in the process.

This is how Unix has worked forever.

'cd' and 'pwd' are bash built-in commands, so bash has cached the last 'cd' path, and when you issue 'pwd', bash just echos the cached path information. It does not verify anything before displaying the path.

If you want to see the real current path, then try using

/bin/pwd

this will do the more complex reverse path reconstruction, which can have some unexpected responses, because of symbolic and hard links that may have been used to navigate down to the current directory location.
Worse is that even if you delete the folder "xyz" and empty trash. Even then using 'pwd' command would show your present working directory as "xyz" folder.

Again, bash is just echoing the cached path that bash last knew about.

Also since the process still has an open file descriptor to the directory open in the process as the current working directory, the file system will defer the actual directory delete until after that file descriptor is closed.

The fact that a file or directory will not be truely deleted if it is still open, allows an application to continue to use a file if it has it open, even when some other process deletes the file. This can be good for the application, but if that was a huge file and you were trying to free up space, you would not see the space returned until after the process that has the file open, closes the file.

You can use the 'lsof' command to find what processes have what files/directories open.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition, it was advised that, if I have additional Unix or Terminal related questions it would be best to post them in the Mac OS X Technologies > Unix Forum. So, one place where you can also redirect yourself for taking other unix Vodka Shots is Apple Unix Discussions

1 comment:

  1. whoa!
    i read this on Apple website too. so u r the one.

    ReplyDelete