假设我有一个文件夹:
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
吗?谢谢
fish
当您cd
进入外壳程序时,该外壳程序会自动解析该符号链接。
假设我有一个文件夹:
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
吗?谢谢
fish
当您cd
进入外壳程序时,该外壳程序会自动解析该符号链接。
Answers:
根据pwd
命令的配置方式,它可能默认为显示逻辑工作目录(由输出pwd -L
)显示符号链接位置,或物理工作目录(由输出pwd -P
)忽略符号链接并显示“真实”目录。
有关完整的信息,您可以做
file "$(pwd -L)"
在符号链接中,这将返回
/path/of/symlink: symbolic link to /path/of/real/directory
-P
旗帜是我所需要的。谢谢
test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(或替换&& echo No symlinks
为|| echo Symlinks
)。
file "$(pwd)"
仅当符号链接是最后一个目录组件时才有效。CD到时,它不会检测OP的符号链接/home/cpm135/public_html/class/foo/bar
。我不知道可以在路径名中显示所有符号链接信息的任何内容,但是您也可以使用realpath .
,我认为这等效于pwd -P
请注意,这pwd
实际上是内置的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 -f
。readlink -f .
与...类似pwd -P
。
readlink -f
并非所有
您确实在/home/cpm135/public_html/class
-这是“我当前的工作目录是什么”问题的唯一正确答案。
当您提到/var/lib/class
...时,这实际上并不是您所处的位置,而是有关您以前到达那条路的更多信息。
当您运行时/bin/pwd
,它会通过查看找出当前工作目录。和..目录(在顶部列出的目录ls -la
),找出..中的哪个目录与匹配。然后向后工作,直到..和。指同一目录。完成所有这些操作后,它将知道您当前的工作目录是什么。
当您运行pwd
内置的shell时,它不会遵循此过程(尽管如果需要它可能会做一些事情),而是会记住您到达此处的路径。因此,每次执行cd
命令时,shell都会记住这是获取当前位置的路径的一部分,并pwd
打印出根据cd
您已执行的所有命令计算出的结果-可能不是您实际的工作目录。
当您执行a ln -s . foo
并继续cd
进入foo 时,事情会变得很奇怪- /bin/pwd
会说您仍在同一目录中,但是内建的shell pwd
会说您在/foo/foo/foo/foo/foo/foo
-即使没有这样的目录。(也就是说-您可能可以 cd
加入。)
如果目录已重命名,则会引起混乱。 /bin/pwd
会立即接受更改,但是内置功能只有在pwd
您执行告诉它旧目录名称无关紧要的操作后才会生效。
pwd
内置组件之间的区别/bin/pwd
以及解释独立版本如何提供更多有用信息(可以回答原始问题)非常有用。
-P
和-L
选项。简而言之,某些实现默认为一种,而另一种默认。在我必须使用的Centos系统上,bash的内置默认为逻辑,/bin/pwd
默认为物理,但是两者都接受两个命令行选项并在给出结果时达成一致。
ls ..
将显示的内容/var/lib
,而不是/home/cpm135/public_html
。 cd ..
是很特别的:shell对“您到达那里的方式”进行了特别的跟踪,实际上并没有进行chdir("..")
系统调用。就内核而言,shell的当前工作目录(/proc/self/cwd
)只是一个mountpoint:inode对。就像目录上的打开文件描述符一样,这就是为什么重命名目录不会破坏外壳程序的原因。(cd .
更新外壳程序的$PWD
变量)。您提出了一个有用的观点,因此固定后我会予以表决
本质上,您是在询问是否要显示当前工作目录的实际路径。好吧,有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
如您所见,python os.getcwd()
解析目录的实际路径,而不是符号链接的路径。