符号链接和 sudo

iDe*_*247 10 shell bash sudo symbolic-link

我创建了一个符号链接:

ln -s /tmp/folder1 /tmp/folder2

然后我去 /tmp/folder2 并运行pwd

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
Run Code Online (Sandbox Code Playgroud)

为什么pwdwithsudo给了原目录?我正在编写一个 bash 脚本,需要当前目录的绝对路径。使用 sudo 我似乎无法获得原始目录。

use*_*517 14

PWD命令既是内置和/ bin中/密码壳。在正常情况下,内置命令会优先于 /bin/pwd 运行。pwd 命令可以调用为pwd -Lpwd -P内置和 /bin/pwd 默认为pwd -L来自手册页

-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"  
Run Code Online (Sandbox Code Playgroud)


Fel*_*ank 6

在 bash 中,pwd是一个内置函数。/bin/pwd产生与 相同的行为sudo pwd

你会想要

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