Behavior of cd/bash on symbolic links

前端 未结 2 1936
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-13 19:20

Assume I have the folders ~/a/b in my home folder, and the folder b contains a symbolic link to \'..\' named \'symlink\'. Then I perform the following actions in bash:

相关标签:
2条回答
  • 2020-12-13 19:40

    According to help cd,

      Options:
          -L        force symbolic links to be followed: resolve symbolic
                    links in DIR after processing instances of `..'
          -P        use the physical directory structure without following
                    symbolic links: resolve symbolic links in DIR before
                    processing instances of `..'
    
    

    In other words, -L means using the logical structure, whereas -P uses the actually physical directory structure.

    The logical structure is like this,

    $ tree a
    a
    └── b
        └── symlink -> ..
    

    The actual physical structure when you go to a/b/symlink is,

    a
    

    If you want to use the real .., then you must also use cd -P:

              The -P option says to use the physical directory
              structure instead of following symbolic links (see
              also the -P option to the set builtin command);
              the -L option forces symbolic links to be followed.
    

    An example,

    $ cd
    $ cd a/b/symlink   # physical location is at a/
    $ cd ..            # now is at a/b
    $ cd symlink       # goes back to a/b/symlink
    $ cd -P ..         # follow physical path (resolve all symlinks)
    $ pwd -P           # -P is optional here to show effect of cd ..
    /home/sarnold
    $ 
    
    0 讨论(0)
  • 2020-12-13 19:48

    bash keeps track of the logical current directory path, as shown in your prompt, and interprets things like cd .. according to that. This makes things a little more consistent if you only use such paths in cd (or pushd), at the cost of unexpected things happening if you then expect the same thing to happen with paths in command arguments (or inside commands; emacs and vim have their own configurable rules for symlink handling, but most commands rely on the kernel to deal with it).

    0 讨论(0)
提交回复
热议问题