为了账号安全,请及时绑定邮箱和手机立即绑定

以编程方式可靠地检索容器中 go 可执行文件的路径,而无需使用 Go

以编程方式可靠地检索容器中 go 可执行文件的路径,而无需使用 Go

Go
Qyouu 2023-06-12 15:21:08
如何go在没有which 编程方式的容器中检索二进制文件的路径?一种选择是which go按如下方式执行:bytes, err := exec.Command("which", "go").Output()但是,我不想依赖于which可用。go 是否提供任何内置机制来检索它,如果没有,除了让用户自己传递路径之外还有什么选择?
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

从手册页which

这需要一个或多个参数。对于它的每个参数,它将在 shell 提示符下输入该参数时将执行的可执行文件的完整路径打印到标准输出。它通过使用与 bash(1) 相同的算法在环境变量 PATH 中列出的目录中搜索可执行文件或脚本来执行此操作。

Go 的os/exec.LookPath功能非常接近这个功能:

LookPath 在 PATH 环境变量命名的目录中搜索名为文件的可执行文件。如果文件包含斜线,则直接尝试,不查询 PATH。结果可能是绝对路径或相对于当前目录的路径。

path/filepath.Abs如果您需要有保证的绝对路径,请使用。


查看完整回答
反对 回复 2023-06-12
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我不希望这是最好的答案,但这是我刚刚找到的答案。我希望有更多特定于 go 的类型,但与此同时, linux 中的类型是 bash 和 sh(alpine)中可用的默认内置类型。

type type您可以通过运行which yields来自己测试:

type 是一个内置的 shell

中的用法go如下所示:

b, err := exec.Command("type", "go").Output()


if err != nil {

    /* 'type' is not available on the O/S */

}


goPath := strings.TrimPrefix(strings.TrimSuffix(string(b), "\n"), "go is ")

需要这些函数的原因Trim是因为输出看起来像这样:

go 是 /usr/local/go/bin/go\n

这不是最好的方法,但它确实有效。


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信