Bash

符號連結和 sudo

  • May 8, 2014

我創建了一個符號連結:

ln -s /tmp/folder1 /tmp/folder2

然後我去 /tmp/folder2 並執行pwd

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

**為什麼pwdwithsudo給出原始目錄?**我正在編寫一個 bash 腳本,需要目前目錄的絕對路徑。使用 sudo 我似乎無法獲取原始目錄。

pwd命令既是 shell 內置命令,又是 /bin/pwd 。在正常情況下,內置將優先於 /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"  

引用自:https://serverfault.com/questions/593882