3 回答
TA贡献1794条经验 获得超8个赞
通常,在您的程序看到它之前~
,shell 会对其进行扩展。
以与 shell 扩展机制兼容的方式调整您的程序如何从命令行获取其参数。
可能的问题之一是像这样使用exec.Command:
cmd := exec.Command("some-binary", someArg) // say 'someArg' is "~/foo"
不会被扩展。例如,您可以改用:
cmd := exec.Command("sh", "-c", fmt.Sprintf("'some-binary %q'", someArg))
这将从~
外壳获得标准扩展。
编辑:修复了 'sh -c' 示例。
TA贡献1784条经验 获得超9个赞
Go 提供了os/user包,它允许您获取当前用户以及任何用户的主目录:
usr, _ := user.Current()
dir := usr.HomeDir
然后,使用path/filepath将两个字符串组合为有效路径:
if path == "~" {
// In case of "~", which won't be caught by the "else if"
path = dir
} else if strings.HasPrefix(path, "~/") {
// Use strings.HasPrefix so we don't match paths like
// "/something/~/something/"
path = filepath.Join(dir, path[2:])
}
(注意 user.Current() 没有在 go playground 中实现(可能是出于安全原因),所以我不能给出一个容易运行的例子)。
TA贡献1995条经验 获得超2个赞
通常,在进入您的程序之前~
,您的 shell会对其进行扩展。但也有一些限制。
一般来说,在 Go 中手动进行是不明智的。
我在我的一个程序中遇到了同样的问题,我所理解的是,如果我使用标志格式 as --flag=~/myfile
,它不会被扩展。但是,如果您运行--flag ~/myfile
它,它会被 shell 展开(=
缺少 并且文件名显示为单独的“单词”)。
- 3 回答
- 0 关注
- 236 浏览
添加回答
举报