$ PWD总是等于$(realpath。)

时间:2014-08-09 21:57:30

标签: linux bash shell

鉴于

  • 现代Linux / UNIX / OSX(带realpath
  • bash 4+(即使在OSX上)

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

总是如此?

2 个答案:

答案 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已发生变化。