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

时间:2019-02-15 15:15:36

标签: go

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

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

我尝试了以下操作,但结果为“未知的转义序列”。显然,它确实在外壳中工作。我也尝试将字符串和原始字符串文字结合起来,但是没有成功。我该如何逃避反击?

var (
    MY_STRING = "something\`something"
)

2 个答案:

答案 0 :(得分:2)

反引号不需要转义,Go可以将其保留在字符串(ref)中。

但是,bash会将字符串之外的反引号视为subshell syntax。逃避bash中反引号的最简单方法是将其包含在single-quoted string中:

var MY_STRING = "'something`something'"

但是,由于您在格式字符串中使用了%q,因此这不会达到预期的效果。

相反,您可以使用发布在this question上的解决方案。 Bash需要在双引号内对转引号(\\\`)进行两次转义。有完整的解释说明为什么在此链接的问题中有必要这样做。由于Go还将\用作转义字符,因此您需要将每个数字加倍:

var MY_STRING = "something\\\\\\`something"

答案 1 :(得分:2)

使用'在Bourne shell中转义`。无需引用字符串。

MY_STRING := "something'`'something"
cmd := fmt.Sprintf("MY_ENV=%s;", MY_STRING)
out, err := exec.Command("bash", "-c", cmd).CombinedOutput()