使用 sudo 找不到命令,但无需使用 sudo 即可工作

Shi*_*iri 6 bash sudo command

我已经dep在我的GOPATHat 中安装了一个二进制文件/home/me/go/bin以供使用。

运行dep成功执行二进制文件,但运行sudo dep结果sudo: dep: command not found

$ dep
Dep is a tool for managing dependencies for Go projects

Usage: "dep [command]"
...

Use "dep help [command]" for more information about a command.

$ sudo dep
sudo: dep: command not found
Run Code Online (Sandbox Code Playgroud)

路径不是这里的问题:

$ echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin

$ sudo echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin
Run Code Online (Sandbox Code Playgroud)

的路径是作为相同me并且superuser两者引用键目录/home/me/go/bin

为什么在dep没有sudo成功的情况下运行但有sudo结果command not found

Nad*_*'El 5

默认情况下,sudo不会将用户的原始 PATH 传递给超级用户进程,而是获取系统上定义的一些默认 PATH。如果您运行“sudo env”以查看 sudo 进程的整个环境,则很容易看到:

$ sudo 环境 | 路径
PATH=/sbin:/bin:/usr/sbin:/usr/bin

您尝试的命令“sudo echo $PATH”不检查任何内容,因为外壳首先将 $PATH 转换为该变量具有的任何值 - 然后才调用命令(sudo),因此它只打印您的外部环境的值:-)

要让您的 PATH 在 sudo 中传递,您可以执行以下操作:

$ sudo PATH=$PATH sh -c env | 路径
PATH=/usr/share/Modules/bin:/usr/lib64/ccache:/home/nyh/gaps:/home/nyh/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin :/bin:/usr/sbin:/sbin:/usr/games:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/platform-tools:/home/nyh/谷歌云 SDK/bin

基本上,我传递给 sudo 运行的命令首先将 PATH 设置为 $PATH(请记住 $PATH 由外壳扩展,在 sudo 运行之前,我想要的真实路径也是如此!)并运行一个外壳(它将使用这个新的 PAT) 到“env”。如您所见, env 确实找到了正确的路径。你可以用你想运行的任何程序替换“env”。