展开波浪号到主目录

我有一个程序接受将在其中创建文件的目标文件夹。我的程序应该能够处理绝对路径和相对路径。我的问题是我不知道如何扩展~到主目录。


我扩展目的地的功能如下所示。如果给定的路径是绝对路径,则不执行任何操作,否则它将相对路径与当前工作目录连接起来。


import "path"

import "os"


// var destination *String is the user input


func expandPath() {

        if path.IsAbs(*destination) {

                return

        }

        cwd, err := os.Getwd()

        checkError(err)

        *destination = path.Join(cwd, *destination)

}

由于path.Join不扩展~,如果用户传递类似~/Downloads目的地的东西,它就不起作用。


我应该如何以跨平台的方式解决这个问题?


青春有我
浏览 237回答 3
3回答

幕布斯7119047

通常,在您的程序看到它之前~,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' 示例。

千万里不及你

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

拉风的咖菲猫

通常,在进入您的程序之前~,您的 shell会对其进行扩展。但也有一些限制。一般来说,在 Go 中手动进行是不明智的。我在我的一个程序中遇到了同样的问题,我所理解的是,如果我使用标志格式 as --flag=~/myfile,它不会被扩展。但是,如果您运行--flag ~/myfile它,它会被 shell 展开(=缺少 并且文件名显示为单独的“单词”)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go