如何从命令行判断我是否实际上位于符号链接位置?

如何从命令行判断我是否实际上位于符号链接位置?

假设我有一个文件夹:

cd /home/cpm135/public_html

并建立一个符号链接

ln -s /var/lib/class .

后来,我在该目录中:

cd /home/cpm135/public_html/class

pwd会告诉我我在/home/cpm135/public_html/class

有什么办法可以知道我“真的”在吗/var/lib/class?谢谢

答案1

根据pwd命令的配置方式,它可能默认显示逻辑工作目录(由 输出pwd -L),它将显示符号链接位置,或身体的工作目录(由 输出pwd -P)忽略符号链接并显示“真实”目录。

如需完整信息,您可以执行以下操作

file "$(pwd -L)"

在符号链接内,这将返回

/path/of/symlink: symbolic link to /path/of/real/directory

答案2

请注意,这pwd实际上是一个内置的 shell。根据您的 shell 及其配置,结果可能会发生变化。对于更便携的解决方案,您应该使用/bin/pwd.手册页片段:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

一般来说,您可以使用 解析任何文件/目录的完整规范路径readlink -freadlink -f .工作原理类似于pwd -P.

答案3

您确实在/home/cpm135/public_html/class- 这是“我当前的工作目录是什么”问题的唯一正确答案。

当你提到/var/lib/class......时,这实际上并不是关于你在哪里,而是更多关于你是通过什么路径到达那里的

当您运行时/bin/pwd,它会通过查看 .和 .. 目录(在 顶部列出的目录ls -la),找出 .. 中的哪个目录与 .然后向后工作直到 .. 和 .引用同一目录。完成所有这些后,它就知道您当前的工作目录是什么。

当您运行pwd内置 shell 时,它不会遵循此过程(尽管如果需要,它可能会执行其中一些操作)——相反,它会记住您到达此处的路径。因此,每次您执行cd命令时,您的 shell 都会记住该命令,作为到达您现在所在位置的路径的一部分,并pwd打印出它根据cd您执行过的所有命令计算出的内容 - 这可能是也可能不是您的实际命令工作目录。

ln -s . foo当你执行 a并保持cdfoo时,事情会变得非常奇怪-/bin/pwd会说你仍然在同一个目录中,但 shell 内置命令pwd会说你在/foo/foo/foo/foo/foo/foo- 即使这样的目录根本不存在。 (也就是说——你可能 cd进去。)

另一个造成混乱的原因是目录是否被重命名。 /bin/pwd然后会立即接受更改,但内置程序pwd不会,直到您执行一些操作告诉它旧目录名称无关紧要。

答案4

本质上,您是在问是否可以显示当前工作目录的实际路径。好吧,使用 python 和os.getcwd()函数

您在下面看到的是我的主目录中“VirtualBox VMs”目录中的一个小测试。实际上,它是指向位于不同硬盘驱动器上的不同目录的符号链接,安装在/mnt/HDD.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

正如你所看到的,pythonos.getcwd()解析的是目录的真实路径,而不是符号链接的路径。

相关内容