符号链接和 sudo

符号链接和 sudo

我创建了一个符号链接:

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 -Lman 页面中的

-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

你会想要

  1. 使用sudo pwd -L,这只适用于
  2. 包含Defaults env_keep=PWD在您的sudoers文件中

相关内容