sudo -E не может вызывать некоторые команды, расположенные в домашнем каталоге?

симптом:

$ 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) 

@richard, спасибо. Я сделал это:

 $ 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 уважать PATH временно?

Нет! ( /home/usr/opt/android/platform-tools не находится в PATH в среде sudo .) ${PATH} оценивается вашей оболочкой перед запуском sudo , таким образом заменяя значение PATH до начала sudo , а не значение внутри sudo .

Вы правы, подозревая PATH . Однако вы проверяете ложный ответ из-за порядка оценки.

Вам нужно сделать sudo -E /home/usr/opt/android/platform-tools/adb

Как вы нашли, 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 любом случае).