特定
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
已经改变。