Tworzę dowiązanie symboliczne:
ln -s /tmp/folder1 /tmp/folder2
Następnie przechodzę do / tmp / folder2 i uruchamiam pwd
:
$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
Dlaczego pwd
z sudo
nadać oryginalny katalog? Piszę skrypt bash i potrzebuję bezwzględnej ścieżki do bieżącego katalogu. W przypadku sudo nie mogę uzyskać oryginalnego katalogu.
bash
shell
sudo
symbolic-link
iDev247
źródło
źródło
Odpowiedzi:
Polecenie pwd jest zarówno wbudowane w powłokę, jak i / bin / pwd. W normalnych okolicznościach wbudowane będzie uruchamiane zamiast / bin / pwd. Polecenie pwd można wywołać jako
pwd -L
lubpwd -P
Zarówno wbudowane, jak i / bin / pwd domyślnie napwd -L
stronie manwięc kiedy uruchamiasz pwd, faktycznie uruchamiasz pwd -L, który w efekcie wypisuje $ PWD (jeśli istnieje). Po uruchomieniu
sudo pwd
sudo udostępnia tylko zmienne środowiskowe, o których kazano przekazywać za pośrednictwemenv_keep
dyrektyw. PWD zwykle nie znajduje się na tej liście, więc sudo pwd musi ustalić, gdzie się znajduje i w efekcie działa jakopwd -P
Rozwiązaniem problemu jest użycie go,
pwd -P
jeśli chcesz, aby ścieżka fizycznego katalogu była konsekwentna, lub (jak mówi @Felix), aby dodać PWD do listy zmiennych środowiskowych i zachować w sudoers za pomocą dyrektywy env_keepźródło
sudo pwd -L
aby uzyskać logiczną ścieżkę.sudo pwd
zwraca ścieżkę fizyczną.W bash
pwd
jest wbudowany./bin/pwd
daje takie samo zachowanie jaksudo pwd
.Będziesz chciał
sudo pwd -L
, który działa tylko, jeśli tyDefaults env_keep=PWD
w swoimsudoers
plikuźródło