$ PWD总是等于$(realpath。)

特定

  • 现代的Linux / UNIX / OSX(w / realpath
  • bash 4+(甚至在OSX上)

 "$PWD" == "$(realpath .)" 

永远是真的?

测试这很容易,事实并非总是如此。

 $ mkdir /tmp/realdir $ cd /tmp/realdir $ echo $PWD /tmp/realdir $ ln -s realdir /tmp/fakedir $ cd /tmp/fakedir $ echo $PWD /tmp/fakedir $ realpath . /tmp/realdir 

所以不, $PWD并不总是和$(realpath .)

bash手册指出PWD变量是由内置的cd命令设置的。 cd的默认行为是:

符号链接后面是默认的或-L选项

这意味着如果你将cd放入一个符号链接,变量将被解析为相对于符号链接,而不是相对于物理路径。 您可以通过使用-P选项来更改cd命令的此行为。 这将导致它报告PWD变量中的物理目录:

 $ cd -P /tmp/fakedir $ echo $PWD /tmp/realdir 

您可以使用-P选项更改bash的默认行为:

 $ set -P $ cd /tmp/fakedir $ echo $PWD /tmp/realdir $ set +P $ cd /tmp/fakedir $ echo $PWD /tmp/fakedir 

当然,尽管事实上你可以在执行cd之后为PWD变量指定任何东西,并且它取得了这个值:

 $ cd /tmp/fakedir $ PWD=/i/love/cake $ echo $PWD /i/love/cake 

但是这不是你所要求的。

即使不使用符号链接并且用户未设置PWD ,情况也不一定如此。

 vinc17@xvii:~$ mkdir my_dir vinc17@xvii:~$ cd my_dir vinc17@xvii:~/my_dir$ rmdir ../my_dir vinc17@xvii:~/my_dir$ echo $PWD /home/vinc17/my_dir vinc17@xvii:~/my_dir$ realpath . .: No such file or directory 

请注意,在zsh下, ${${:-.}:A}仍然给出与$PWD相同的答案( zshexpn(1)手册页中对A修饰符的解释是:“注意,即使文件任何中介目录不存在“)。

但请注意, $PWD包含过时的信息。 如果其他进程可以删除目录,使用它可能是一个坏主意。 考虑下面的脚本:

 rm -rf my_dir mkdir my_dir cd my_dir echo 1 > file cat $PWD/file rm -r ../my_dir mkdir ../my_dir echo 2 > ../my_dir/file cat ./file cat $PWD/file rm -r ../my_dir 

它会输出:

 1 cat: ./file: No such file or directory 2 

$PWD/file已经改变。