兆候:
$ sudo -E adb
sudo: adb: command not found
$ which adb
/home/usr/opt/android/platform-tools/adb
$ sudo -E echo ${PATH}
...:/home/usr/opt/android/platform-tools
$ stat ~/opt/android/platform-tools/adb
Access: (0775/-rwxrwxr-x) Uid: ( 1000/ usr) Gid: ( 1000/ usr)
@リチャード、ありがとう。私はこれをしました:
$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo 'echo $PATH' | sudo -E sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
したがって、sudoのパスにはありません。しかし、sudoが一時的にPATHを尊重するようにするにはどうすればよいですか?
答え1
まったくそうではありません! (環境の PATH には/home/usr/opt/android/platform-tools
ありません。) 実行する前にシェルで評価するので、in の値ではなく isstart より前の値を置き換えてください。sudo
${PATH}
sudo
PATH
sudo
sudo
あなたの疑いは正しいですPATH
。ただし、評価の順序により、テストでは誤った回答が得られます。
あなたはする必要がありますsudo -E /home/usr/opt/android/platform-tools/adb
答え2
ご存知のように、sudo
リセットを使用すると、$PATH
実行するユーティリティのフルパスを指定でき、ほとんどの単純なケースでは正常に動作します。ただし、場合によっては予約が必要な場合があります。たとえば、プログラムが$PATH
提供されているプログラムの中に見つからない他の$PATH
プログラムを呼び出す必要がある場合ですsudo
。
最も簡単な方法は次のとおりです。
sudo env PATH="$PATH" mycmd
これはシェルの評価順序を利用します。実行する前に展開する$PATH
と、実際には次のようになります。sudo
sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd
sudo
その後、 を呼び出すと指示どおりに設定され、 を呼び出しenv
ます。$PATH
mycmd
これはsudo
、アクセスが制限されず、すべてのコマンド(またはすべてのコマンド)を実行できる場合にのみ機能しますenv
。