bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bug in pwd on Mandrake Linux 9.2


From: Bob Proulx
Subject: Re: bug in pwd on Mandrake Linux 9.2
Date: Fri, 4 Mar 2005 22:19:03 -0700
User-agent: Mutt/1.5.6+20040907i

Seán McGarraghy wrote:
> I am running Mandrake Linux 9.2, the version of pwd is 
> 
> pwd 5.0 March 2003

How did you obtain that version number from pwd?  (I think it is very
strange.)

> I found the following behaviour (running as root at the command line) 
> 
> address@hidden linux32]# pwd
> /usr/local/lindoapi/bin/linux32
> address@hidden linux32]# mv ../../../lindoapi ../../../lindoapi3.0
> address@hidden linux32]# pwd
> /usr/local/lindoapi/bin/linux32
> address@hidden linux32]# ls -al /usr/local/lin*
> drwxr-xr-x   10 root     root          368 Mar  4 17:20 lindoapi3.0/
> 
> That is, I renamed a directory further up the path of the current working 
> directory, but pwd didn't catch this (although ls shows it happened).

Generally that is true.  The default behavior of most modern shells is
to report the logical path and not the physical path.

> I don't know if this bug is still in later versions, but I thought
> you should know.  Its severity is not too big.

Thank you for reporting this.  As has been said, many eyes make all
bugs known.  However you should know that 'pwd' is a shell builtin in
most shells.  In bash, for example:

  type pwd
  pwd is a shell builtin

Therefore when you type in 'pwd' you are not getting an external pwd
such as the GNU pwd usually installed at /bin/pwd but are instead
getting your shell's built in pwd.  Therefore this is not a GNU
coreutils thing but a shell thing.

In the case of the shell it usually tracks the PWD environment
variable by logical path and not by physical path.  The behavior you
are seeing is actually a feature of the shell.  It does this so that
the user does not notice symbolic links in the path.  Here is an
example.

  $ mkdir /tmp/foo
  $ ln -s foo /tmp/bar
  $ cd /tmp/bar
  $ pwd
  /tmp/bar
  $ /bin/pwd
  /tmp/foo

Even though the shell reported the present working directry as
/tmp/bar it only knew that because it tracked how we got there.  That
is the logical path.  We got there through the symlink and so it
reported that value.  But we were really in /tmp/bar because of the
symlink.  The /bin/pwd program did not know about the tracking of the
logical path.  It called the systems getcwd() routine and reported the
real physical path.

In GNU bash the 'set -o physical' option turns off this logical path
tracking of the shell.  Setting that option with your example would
report the new name of the physical present working directory.

In bash:

  $ set -o physical
  $ mkdir /tmp/foo
  $ cd /tmp/foo
  $ mv /tmp/foo /tmp/bar
  $ pwd
  $ /tmp/bar

Hope that helps to explain this.

Bob




reply via email to

[Prev in Thread] Current Thread [Next in Thread]