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

展开波浪号到主目录

展开波浪号到主目录

Go
青春有我 2021-06-19 19:17:43
我有一个程序接受将在其中创建文件的目标文件夹。我的程序应该能够处理绝对路径和相对路径。我的问题是我不知道如何扩展~到主目录。我扩展目的地的功能如下所示。如果给定的路径是绝对路径,则不执行任何操作,否则它将相对路径与当前工作目录连接起来。import "path"import "os"// var destination *String is the user inputfunc expandPath() {        if path.IsAbs(*destination) {                return        }        cwd, err := os.Getwd()        checkError(err)        *destination = path.Join(cwd, *destination)}由于path.Join不扩展~,如果用户传递类似~/Downloads目的地的东西,它就不起作用。我应该如何以跨平台的方式解决这个问题?
查看完整描述

3 回答

?
幕布斯7119047

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' 示例。


查看完整回答
反对 回复 2021-06-21
?
千万里不及你

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 中实现(可能是出于安全原因),所以我不能给出一个容易运行的例子)。


查看完整回答
反对 回复 2021-06-21
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

通常,进入您的程序之前~,您的 shell会对其进行扩展。但也有一些限制

一般来说,在 Go 中手动进行不明智的

我在我的一个程序中遇到了同样的问题,我所理解的是,如果我使用标志格式 as --flag=~/myfile,它不会被扩展。但是,如果您运行--flag ~/myfile它,它会被 shell 展开(=缺少 并且文件名显示为单独的“单词”)。


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

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