Hi Oldřich, 2011/6/13 Oldřich Jedlička <[email protected]>
> Dne pondělí 13 Červen 2011 16:51:54 Loïc Le Loarer napsal(a): > > This behavior is normal. The key here is the .. link in each directory, > it > > always points to the parent directory. > > For example, in your situation, the ".." in z is x, and it cannot be > > something else. > > Even if you access to z using the path x/y/z which use the symbolic link, > > and then use ".." link, you go to x, not y. > > > > You may have the impression that this is not true if you follow the same > > path using your shell, because the shell remember the fact that you use > the > > symbolic link and don't really use the ".." link. When you do "cd .." in > > the shell, it just removes the last element between / in the current > path. > > Thanks for the explanation, that made the things much clearer. I understand > now why the "test -d ../../something" doesn't work under the same > conditions > (because the directory really doesn't exist for the program). > > But what you say is only part of the story. The script/program has the full > knowledge of the current working directory and it can do the same trick > with > the path traversing - remove the ".." in the same way as the shell would > do. > This is normal when you canonicalize the path - remove the ".." from the > path > and do not try to dereference. The key is that getcwd() returns really the > current working directory with symlinks unresolved - this is how the shell > sees it too. > I have tested this last sentence, and as far as I can see, getcwd is returning resolved path. You can check this by doing a small program calling getcwd system call or by launching the command "stat /proc/self/cwd", it is doing the same. In order to know if the current dir which canonical name is "x/z" has been accessed using "cd x/z" or cd "x/y/z", the shell store the access path in PWD. Any script or program can use the PWD variable to mimic the shell behavior (see man get_current_dir_name), but it is not what is expected from mkdir or other basic commands. When you run the "mkdir ../../dir_xy" command, mkdir command is calling the mkdir system call with "../../dir_xy" argument, and each part of the relative part is resolved by the kernel, the first ".." is pointing to the "x" directory, not the "y". And that's it. Best regards Loïc > > I agree that it is a bit strange, but once you understand the fact that > > each directory contains a ".." link which points to one unique location > > and that when the path is interpreted by the kernel, it always follows > > those links, you understand how it works. > > Yes. it is strange and the program has the full knowledge to do the right > thing (TM) :-) So I think this can be fixed actually. > > Best regards, > Oldrich. > > > > > Best regards > > Loïc > > > > 2011/6/13 Oldřich Jedlička <[email protected]> > > > > > Hi all, > > > > > > I was trying to search for any description helping me understand in > what > > > I see, but actually I didn't find any, so I'm here. I discovered it by > > > using automake-1.11, because it uses relative paths a lot. So my > > > simplified testcase is as follows: > > > > > > Have a directory structure x/y and x/z/a. Have a symbolic link from > x/y/z > > > that points to x/z. > > > > > > mkdir -p x/y > > > mkdir -p x/z/a > > > ln -s ../z x/y/z > > > > > > Now go into x/y/z/a and try to create directory like that: > > > cd x/y/z/a > > > mkdir ../dir_xyz > > > mkdir ../../dir_xy > > > mkdir ../../../dir_x > > > > > > I would expet that there would be a directory like this: > > > x/dir_x > > > x/y/dir_xy > > > x/y/z/dir_xyz (x/z/dir_xyz) > > > > > > But the result is completely different: > > > dir_x > > > x/dir_xy > > > x/y/z/dir_xyz (x/z/dir_xyz) > > > > > > So when you want to create a directory in the parent structure from > > > within the symbolic link, you will fail in doing so, because the > > > symbolic link would be resolved during walking through parents, so you > > > can get to completely different tree while creating your directory. It > > > looks like a bug, because it is nowhere documented to behave like that > > > (and the behaviour is strange by itself). > > > > > > Verified on Debian 4.0/RedHat 5.4 with coreutils 5.97 and on Gentoo > with > > > coreutils 8.12. > > > > > > Regards, > > > Oldrich. > -- Loïc
