我已经通过安装了几个 Go 实用程序go get -u github.com/[owner]/[repo]
,但我不明白为什么它们不遵守标准 shell 约定。我安装的实用程序在运行命令的目录中没有任何痕迹,也没有任何输出指示任何内容,所以我通过一种相当标准的方式寻找它,但找不到它,但我总是能够运行它:
~ $ which hey
~ $ hey
Usage: hey [options...] <url>
Options:
-n Number of requests to run. Default is 200.
-c Number of requests to run concurrently. Total number of requests cannot be smaller than the concurrency level. Default is 50.
[…]
$PATH
我之所以能找到它,是因为我注意到我的includes末尾有:~/go/bin
,而且我安装的三个go实用程序确实在那里。省去了我漫长的find
搜索。
Go 安装的二进制文件如何逃避标准文件查找方式,但仍能运行?
这是在标准 bash shell 上发生的,随 macOS High Sierra(10.13.6)一起提供。
~ $ type -a hey
hey is /Users/jsalaz/go/bin/hey
~ $ type -a which
which is /usr/bin/which
答案1
据我所知,使用~/go/bin
$PATH 组件依赖于非标准(可能是 GNU?)扩展。
每当您的 shell (bash) 搜索二进制文件时,它都会将前缀扩展
~/
为您的主目录的路径。您可以看到type
(内置于 shell 中)可以顺利找到 Go 程序。同时,该
/usr/bin/which
命令(由 macOS 提供,不是 shell 的一部分)才不是进行此扩展,因为开放群组的$PATH 应如何工作的官方描述。
换句话说,~/
前缀是 shell 语言的一部分,但是不是是操作系统通用路径语法的一部分。在所有其他地方,包括 $PATH(不仅限于 shell!),它仅表示名为 的目录~
。
设置 $PATH 时,需要确保在分配时扩展路径:
PATH=$PATH:~/go/bin
PATH=$PATH:$HOME/go/bin
PATH="$PATH:$HOME/go/bin"
这个不行:
PATH="$PATH:~/go/bin"