我已经在dep
的{{1}}中安装了二进制文件GOPATH
。
运行/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
路径与$ 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
和me
相同,都引用密钥目录superuser
。
为什么在没有/home/me/go/bin
的情况下运行dep
却在有sudo
的情况下成功运行sudo
呢?
答案 0 :(得分:2)
默认情况下,sudo
不会将用户的原始PATH传递给超级用户进程,并且会获得系统上定义的一些默认PATH。很容易看出您是否运行“ sudo env”来查看sudo进程的整个环境:
$ sudo env | grep PATH PATH=/sbin:/bin:/usr/sbin:/usr/bin
您尝试的命令“ sudo echo $ PATH”不检查任何内容,因为外壳程序首先将$ PATH转换为该变量具有的任何值-然后才调用命令(sudo),因此它只打印您的外部环境的价值:-)
要使您的PATH在sudo中传递,您可以执行以下操作:
$ sudo PATH=$PATH sh -c env | grep PATH 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/google-cloud-sdk/bin
基本上,我为sudo运行而传递的命令是通过将PATH设置为$ PATH开始的(记住$ PATH是在sudo运行之前由外壳扩展的,所以我想要的真实路径是!)并运行一个shell(它将使用此新的PAT)来“ env”。如您所见,env确实获得了正确的路径。您可以用任何要运行的程序替换“ env”。