为什么 Go(lang)二进制文件不出现在“which”、“whereis”和类似工具中?

为什么 Go(lang)二进制文件不出现在“which”、“whereis”和类似工具中?

我已经通过安装了几个 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"

相关内容