シンボリックリンクとsudo


10

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

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では、元のディレクトリを取得できないようです。


pwdが両方の物理(/ tmp / folder1)パスまたは論理(/ tmp / folder2)パスを返すようにする目標はありますか?
user9517

目的は、sudoを使用するときに論理パスを返すことです
iDev247

回答:


14

PWDコマンドは、シェル組み込みおよび/ binに/ PWDの両方です。通常の状況では、ビルトインは/ bin / pwdよりも優先して実行されます。pwdコマンドは、次のように呼び出すことができます。pwd -Lまたはpwd -P、組み込みと/ bin / pwdの両方をデフォルトでpwd -Lmanページから呼び出すことができます。

-L、--logicalシンボリックリンクが含まれている場合でも、環境からPWDを使用します

したがって、pwdを実行すると、実際にはpwd -Lが実行され、実際には$ PWD(存在する場合)が出力されます。を実行するとsudo pwd、sudoは、env_keepディレクティブを介して渡すように指示されている環境変数のみを提供します。PWDは通常このリストにないため、sudo pwdはどこにあるかを確認する必要があり、実際には次のように実行されますpwd -P

-P、-物理的にすべてのシンボリックリンクを回避

問題を解決する方法は、pwd -P常に物理ディレクトリパスが必要な場合に使用するか、(@ Felixが言うように)PWDを環境変数のリストに追加して、sudoersのenv_keepディレクティブを介して保持することです。

env_keep += "PWD"  

動作します!PWDがenv_keepに追加された後sudo pwd -L、論理パスを取得するために実行する必要があります。sudo pwd物理パスを返します。
iDev247 2014年

6

bashではpwd、組み込みです。/bin/pwdと同じ動作になりsudo pwdます。

あなたがしたいでしょう

  1. を使用しますsudo pwd -L。これは、
  2. 含めるDefaults env_keep=PWDあなたにsudoersファイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.