Go 中的转义反引号(exec.Command 中使用的字符串)

鉴于此代码,我不知道如何转义反引号。


var (

    MY_STRING = "something`something"

)

cmd := fmt.Sprintf("MY_ENV=%q;", MY_STRING)

out, err := exec.Command("bash", "-c", cmd).CombinedOutput()

// results in MY_ENV="something`something" ie unfinished input

我试过下面的但它导致“未知的转义序列”。它显然在 shell 中工作。我也尝试过组合字符串和原始字符串文字,但没有成功。请问我怎样才能逃避反引号?


var (

    MY_STRING = "something\`something"

)


守着一只汪
浏览 178回答 3
3回答

料青山看我应如是

用于在 Bourne shells 中'逃脱`。无需引用字符串。MY_STRING := "something'`'something"cmd := fmt.Sprintf("MY_ENV=%s;", MY_STRING)out, err := exec.Command("bash", "-c", cmd).CombinedOutput()

繁花如伊

反引号不需要转义 Go 就可以将其留在字符串 ( ref ) 中。但是,bash 会将字符串外的反引号视为子 shell 语法。在 bash 中转义反引号的最简单方法是将其包含在单引号字符串中:var MY_STRING = "'something`something'"但是由于您在格式字符串中使用%q,因此不会按预期运行。Bash 需要在双引号内对反引号 ( \\\`) 进行两次转义。在那个链接的问题中有一个完整的解释为什么这是必要的。由于 Go 还用作\转义字符,因此您需要将每个字符加倍:var MY_STRING = "something\\\\\\`something"

阿晨1998

您可以尝试//go:embed foo.sh将外部 shell 文件嵌入到您的代码中。像这样:    //go:embed yourshell.sh     var yourshell string将 shell 文件放在代码的同一文件夹中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go