我正在用Go模块调用kubectl,如下所示:
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", "~/.kube/<kube-config-file>", "get", "ns")
如果我像这样设置路径就可以了:
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", "../../../../.kube/<kube-config-file>", "get", "ns")
我正在使用Go cmd包
当前这个模块位于另一个repo中,这就是为什么它必须向上导航四层。我认为这是因为命令是从这个文件的角度运行的,但它似乎不应该这样做。如果它是简单的运行它作为一个cli命令第一个(我认为)应该工作。
当我从cli手动运行这个命令时,它工作得很好:
$ kubectl --kubeconfig ~/.kube/<kube-config-file> get ns
使用~
作为快捷方式是bash特有的。~
只抓取用户的$HOME目录,但不能在shell的所有实现中工作。这是可以从终端使用的东西,但并不总是从代码中使用(它不是独立于shell的)。但是,go也可以使用os.UserHomeDir()
找到当前用户的主目录。
https://pkg.go.dev/os UserHomeDir
像这样的东西应该可以工作
package main
import (
"fmt"
"os"
)
func main() {
homeDir, _ := os.UserHomeDir()
fmt.Printf("%s/.kube/<kube-config-file>", homeDir)
}
输出:/root/.kube/<kube-config-file>
由于您正在使用的包提到它包装了Go的os/exec
包,这里是他们文档的摘录:
与"系统"不同从C和其他语言的库调用Os/exec包有意不调用系统shell和不展开任何全局模式或处理其他展开;管道或重定向通常由shell完成。这个包表现得更像C的"执行"。函数族。向全球扩张模式,或者直接调用shell,注意避免任何或者使用path/filepath包的Glob函数。来展开环境变量,使用操作系统的ExpandEnv.
所以我想你会想尝试这样做:
import "os"
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", os.ExpandEnv("$HOME/.kube/<kube-config-file>"), "get", "ns")
正如其他人提到的,我需要获取主目录环境变量。但是我是这样实现的:
homePath, _ := os.LookupEnv("HOME")
//
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", homePath+"/.kube/<kube-config-file>", "get", "ns")