一尘不染

扩展波浪号到主目录

go

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

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

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目的地之类的信息,它将不会起作用。

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


阅读 285

收藏
2020-07-02

共1个答案

一尘不染

通常,~外壳程序会 程序看到它 之前 将其展开。
调整程序与外壳扩展机制兼容的方式从命令行获取其参数的方式。

可能的问题之一是使用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”示例。

2020-07-02