鉴于
realpath
)bash
4+(即使在OSX上)时
"$PWD" == "$(realpath .)"
总是如此?
答案 0 :(得分:6)
很容易测试情况并非总是如此。
$ 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 manual表示PWD
变量由内置cd
命令设置。默认behaviour of cd是:
默认情况下使用符号链接或使用-L选项
这意味着如果您进入符号链接,变量将相对于符号链接进行解析,而不是相对于物理路径。您可以使用cd
选项更改-P
命令的此行为。这将导致它报告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
当然,尽管您可以在执行PWD
后将cd
变量分配给$ cd /tmp/fakedir
$ PWD=/i/love/cake
$ echo $PWD
/i/love/cake
变量并且它取值:
{{1}}
但那并不是你所要求的。
答案 1 :(得分:0)
即使未使用符号链接且用户未设置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
已发生变化。