シンボリックリンクを作成します。
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の両方は、manページからデフォルトでpwd -L
に設定されています。
-L、-logicalシンボリックリンクが含まれている場合でも、環境からPWDを使用します
したがって、pwdを実行すると、実際には$ PWD(存在する場合)を出力するpwd -Lを実行します。 Sudo pwd
を実行すると、Sudoはenv_keep
ディレクティブを介して渡すように指示されている環境変数のみを提供します。 PWDは通常このリストに含まれないため、Sudo pwdはそれがどこにあるかを把握する必要があり、実際にはpwd -P
として実行されます
-P、-物理的にすべてのシンボリックリンクを回避
問題を解決する方法は、物理ディレクトリパスが一貫して必要な場合はpwd -P
を使用するか、(@ Felixが言うように)PWDを環境変数のリストに追加して、sudoersのenv_keepディレクティブを介して保持することです
env_keep += "PWD"
Bashでは、pwd
は組み込みです。 /bin/pwd
はSudo pwd
と同じ動作をします。
あなたがしたいでしょう
Sudo pwd -L
を使用してください。sudoers
ファイルにDefaults env_keep=PWD
を含めます