징후:
$ 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
.