Ich erstelle eine symbolische Verknüpfung:
ln -s /tmp/folder1 /tmp/folder2
Dann gehe ich zu / tmp / folder2 und starte pwd
:
$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
Warum gibt man pwd
mit sudo
das Originalverzeichnis? Ich schreibe ein Bash-Skript und benötige den absoluten Pfad des aktuellen Verzeichnisses. Mit sudo kann ich anscheinend nicht in der Lage sein, das ursprüngliche Verzeichnis zu erhalten.
bash
shell
sudo
symbolic-link
iDev247
quelle
quelle
Antworten:
Der Befehl pwd ist sowohl eine integrierte Shell als auch / bin / pwd. Unter normalen Umständen wird das eingebaute System bevorzugt gegenüber / bin / pwd ausgeführt. Der Befehl pwd kann aufgerufen werden ,
pwd -L
oderpwd -P
sowohl auf die builtin und / bin / pwd Standardpwd -L
aus der ManpageWenn Sie also pwd ausführen, führen Sie tatsächlich pwd -L aus, wodurch tatsächlich $ PWD gedruckt wird (falls vorhanden). Wenn Sie ausführen
sudo pwd
, stellt sudo nur die Umgebungsvariablen bereit, die überenv_keep
Anweisungen weitergegeben werden sollen. PWD ist normalerweise nicht in dieser Liste enthalten, daher muss sudo pwd herausfinden, wo es sich befindet, und läuft tatsächlich alspwd -P
Die Möglichkeit, das Problem zu lösen, besteht darin, entweder
pwd -P
den physischen Verzeichnispfad zu verwenden oder (wie @Felix sagt) PWD zur Liste der Umgebungsvariablen hinzuzufügen, die über eine env_keep-Direktive in sudoers beibehalten werden sollenquelle
sudo pwd -L
den logischen Pfad ermitteln.sudo pwd
Gibt den physischen Pfad zurück.In Bash
pwd
ist ein eingebauter./bin/pwd
ergibt das gleiche Verhalten wiesudo pwd
.Du wirst es wollen
sudo pwd -L
, was nur funktioniert, wenn SieDefaults env_keep=PWD
in Ihrersudoers
Dateiquelle