符号链接和sudo


10

我创建一个符号链接:

ln -s /tmp/folder1 /tmp/folder2

然后我转到/ tmp / folder2并运行pwd

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part

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


您的目标是让pwd返回两者的物理(/ tmp / folder1)路径还是逻辑(/ tmp / folder2)路径?
user9517

目标是使用sudo时返回逻辑路径
iDev247 2014年

Answers:


14

PWD命令既是内置和/ bin中/密码壳。通常情况下,内置程序将优先于/ bin / pwd运行。pwd命令可以称为pwd -Lpwd -P内置命令和/ bin / pwd默认都可以pwd -L从手册页中获取

-L,-逻辑使用环境中的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"  

作品!将PWD添加到env_keep之后,我需要执行操作sudo pwd -L以获取逻辑路径。sudo pwd返回物理路径。
iDev247

6

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

你会想要

  1. 使用sudo pwd -L,只有在您使用
  2. 包含Defaults env_keep=PWD在您的sudoers文件中
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.