我创建了一个符号链接:
ln -s /tmp/folder1 /tmp/folder2
然后我转到 /tmp/folder2 并运行pwd
:
$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
为什么要pwd
给出sudo
原始目录?我正在编写一个 bash 脚本,需要当前目录的绝对路径。使用 sudo 我似乎无法获取原始目录。
答案1
这密码命令既是 shell 内置命令,又是 /bin/pwd。在正常情况下,内置命令将优先于 /bin/pwd 运行。pwd 命令可以这样调用,pwd -L
或者pwd -P
内置命令和 /bin/pwd 都默认为pwd -L
man 页面中的
-L, --logical 使用环境中的 PWD,即使它包含符号链接
因此,当您运行 pwd 时,您实际上运行的是 pwd -L,它实际上会打印 $PWD(如果存在)。当您运行 时sudo pwd
,sudo 仅提供已被告知通过指令传递的环境变量env_keep
。PWD 通常不在此列表中,因此 sudo pwd 必须找出它的位置,并实际上按以下方式运行pwd -P
-P, --physical 避免所有符号链接
解决问题的方法是使用(pwd -P
如果您始终想要物理目录路径)或(如@Felix 所说)将 PWD 添加到要通过 sudoers 中的 env_keep 指令保留的环境变量列表中
env_keep += "PWD"
答案2
在 bash 中,pwd
是一个内置命令。/bin/pwd
产生与相同的行为sudo pwd
。
你会想要
- 使用
sudo pwd -L
,这只适用于 - 包含
Defaults env_keep=PWD
在您的sudoers
文件中