Создаю символическую ссылку:
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 я не могу получить исходный каталог.
В pwd это и встроенная оболочка, и / bin / pwd. В нормальных условиях встроенная команда будет запускаться вместо / bin / pwd. Команду pwd можно вызвать как pwd -L
или pwd -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 в список переменных среды, которые нужно сохранить, с помощью директивы env_keep в sudoers
env_keep += "PWD"
В баше pwd
является встроенным. /bin/pwd
дает то же поведение, что и sudo pwd
.
Вы захотите
sudo pwd -L
, который работает, только если выDefaults env_keep=PWD
в твоем sudoers
файл