我已经通过安装了两个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
include的尾端:~/go/bin
,并且确定那里已经安装了我安装的三个go实用程序。从漫长的find
搜索中拯救了我。
Go安装的二进制文件如何逃避标准文件查找方式,但仍然能够运行?
这是在macOS High Sierra(10.13.6)随附的标准bash shell上发生的。
~ $ type -a hey
hey is /Users/jsalaz/go/bin/hey
~ $ type -a which
which is /usr/bin/which
据我了解,~/go/bin
用作$ PATH组件依赖于非标准(也许是GNU?)扩展。
每当shell(bash)搜索二进制文件时,它都会将~/
前缀扩展到主目录的路径。您可以看到type
(内置在Shell中)找到Go程序就可以了。
同时,该/usr/bin/which
命令(由macOS提供,并且不是外壳程序的一部分)不会执行此扩展,因为The Open Group在$ PATH应该如何工作的官方描述中未指定任何此类内容。
换句话说,~/
前缀是外壳程序语言的一部分,而不是常规的操作系统范围路径语法的一部分。在所有其他地方,包括$ PATH(不限于shell!),它仅表示一个名为的目录~
。
设置$ PATH时,您需要确保在分配时扩展路径:
PATH=$PATH:~/go/bin
PATH=$PATH:$HOME/go/bin
PATH="$PATH:$HOME/go/bin"
这将不起作用:
PATH="$PATH:~/go/bin"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句