症状:
$ 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
不它不是! (/home/usr/opt/android/platform-tools
不在sudo
环境中的 PATH 中。)在运行${PATH}
之前由 shell 进行评估,因此替换before isstartsudo
的值,而不是 中的值。PATH
sudo
sudo
你的怀疑是正确的PATH
。然而,由于评估的顺序,您的测试给出了错误的答案。
你需要做sudo -E /home/usr/opt/android/platform-tools/adb
答案2
正如您所发现的,sudo
重置$PATH
.您可以指定要执行的实用程序的完整路径,在大多数简单的情况下,这工作得很好。但在某些情况下,您可能需要保留$PATH
,例如程序需要调用提供的 中未找到的其他$PATH
程序sudo
。
最简单的方法是:
sudo env PATH="$PATH" mycmd
这利用了 shell 的求值顺序。在运行$PATH
之前展开,所以它实际上变成:sudo
sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd
sudo
然后简单地调用env
,它$PATH
按照指示设置,然后调用mycmd
。
请注意,这仅在您的sudo
访问不受限制并且可以运行任何命令(或任何env
命令)的情况下才有效。