web-dev-qa-db-ja.com

シンボリックリンクとsudo

シンボリックリンクを作成します。

ln -s /tmp/folder1 /tmp/folder2

次に、/ tmp/folder2に移動してpwdを実行します。

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

なぜpwdSudoが元のディレクトリを与えるのですか? bashスクリプトを書いていて、現在のディレクトリの絶対パスが必要です。 Sudoを使用すると、元のディレクトリを取得できないようです。

10
iDev247

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"  
14
user9517

Bashでは、pwdは組み込みです。 /bin/pwdSudo pwdと同じ動作をします。

あなたがしたいでしょう

  1. Sudo pwd -Lを使用してください。
  2. sudoersファイルにDefaults env_keep=PWDを含めます
6
Felix Frank