unix, difference between path starting with '/' and '//'

19,472

Solution 1

For the most part, repeated slahes in a path are equivalent to a single slash. This behavior is mandated by POSIX and most applications follow suit. The exception is that “a pathname that begins with two successive slashes may be interpreted in an implementation-defined manner” (but ///foo is equivalent to /foo).

Most unices don't do anything special with two initial slashes. Linux, in particular, doesn't. Cygwin does: //hostname/path accesses a network drive (SMB).

What you're seeing is not, in fact, Linux doing anything special with //: it's bash's current directory tracking. Compare:

$ bash -c 'cd //; pwd'
//
$ bash -c 'cd //; /bin/pwd'
/

Bash is taking the precaution that the OS might be treating // specially and keeping it. Dash does the same. Ksh and zsh don't when they're running on Linux, I guess (I haven't checked) they have a compile-time setting.

Solution 2

From the POSIX Specification:

A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.

I assume Linux bash keeps this behavior in case there's a compelling future use.

(I've always heard that Al Viro kept it in place because there is a feature from Plan9 that uses it, and he'd like to have that feature in Linux, but I'm having trouble finding that feature in my Plan9 documentation. But, since it is in bash instead, Al probably doesn't have anything to do with it.)

Solution 3

According to the POSIX definition, paths starting with a double-slash (//) "...may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash." If you use csh, for example, it doesn't act the same way:

% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/

Bash appears to be storing the directory, and pwd is reporting the $PWD, while csh appears to be using the getcwd() function to get the actual directory.

Share:
19,472

Related videos on Youtube

Shum
Author by

Shum

Updated on September 18, 2022

Comments

  • Shum
    Shum almost 2 years

    In unix/linux, any number of consecutive forwardslashes in a path is generally equivalent to a single forwardslash. eg.

    $ cd /home/shum
    $ pwd
    /home/shum
    $ cd /home//shum
    $ pwd
    /home/shum
    $ cd /home///shum
    $ pwd
    /home/shum
    

    Yet for some reason two forwardslashes at the beginning of an absolute path is treated specially. eg.

    $ cd ////home
    $ pwd
    /home
    $ cd ///
    $ pwd
    /
    $ cd //
    $ pwd
    //
    $ cd home//shum
    $ pwd
    //home/shum
    

    Any other number of consecutive forwardslashes anywhere else in a patch gets truncated, but two at the beginning will remain, even if you then navigate around the filesystem relative to it.

    Why is this? Is there any difference between /... and //... ?

    • Admin
      Admin about 13 years
      That doesn’t happen on Solaris, Darwin, or OpenBSD.
    • Admin
      Admin about 13 years
      @grawity: No no no. It is a namei() thing, not a shell thing!! It happens on Linux, just not on the others.
    • Admin
      Admin about 13 years
      @thchrist: 1) What do you mean by "namei()"? If you are referring to a syscall or library function, then I haven't yet heard of such. There's only a /usr/bin/namei, but it is not related. 2) It is a shell thing, since it only happens with sh and bash, but not with zsh/csh/tcsh, nor with the chdir() syscall. 3) It happens on "the others" - I just tested NetBSD 5.0 and FreeBSD 6.3, and cd //bin shows exactly the same behavior.
    • Admin
      Admin over 12 years
      I hate to nag, but it's called a ‘slash’. There's the ‘slash’ and the ‘backslash’. The ‘forward slash’ (sic) seems to be a recent construct, and I mostly hear it from people on TV.
    • Admin
      Admin over 9 years
    • Admin
      Admin over 7 years
  • jlliagre
    jlliagre about 13 years
    I remember that double slash to allow remote file system access in an early system V implementation (Utek V & DFS). The syntax was //servername/path. Just like Solaris automounter would use now /net/servername/path.
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' about 13 years
  • Stéphane Gimenez
    Stéphane Gimenez over 12 years
    And zsh acts like csh, but does the trimming by itself.
  • janm
    janm over 12 years
    @jlliagre: I remember that from AT&T RFS. (Remote File System) Was in System V.
  • G-Man Says 'Reinstate Monica'
    G-Man Says 'Reinstate Monica' over 8 years
    Interesting; when I do bash -c 'cd //; /bin/pwd', I get //.  Cygwin (8.23-4) with bash version 4.1.17(9)-release and pwd (GNU coreutils) 8.23.  Even more surprising, I still get // if I do /bin/pwd -P.
  • Mr. Lance E Sloan
    Mr. Lance E Sloan almost 8 years
    Python's posixpath.normpath() function also retains double leading slashes. I tried to find out why, which brought me here. It's unfortunate that it does this, because what I've read indicates that double leading slashes is no longer important.
  • galzra
    galzra over 7 years
    For the record, fish does not do this. If you run cd //; pwd, or fish -c 'cd //; pwd', you get /, and if you run the former with a default prompt, the prompt has just 1 slash.