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

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

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

Go
守着一只汪 2023-06-05 19:32:16
鉴于此代码,我不知道如何转义反引号。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")
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

用于在 Bourne shells 中'逃脱`。无需引用字符串。


MY_STRING := "something'`'something"

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

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


查看完整回答
反对 回复 2023-06-05
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

但是,bash 会将字符串外的反引号视为子 shell 语法。在 bash 中转义反引号的最简单方法是将其包含在单引号字符串中:

var MY_STRING = "'something`something'"

但是由于您在格式字符串中使用%q,因此不会按预期运行。

Bash 需要在双引号内对反引号 ( \\\`) 进行两次转义。在那个链接的问题中有一个完整的解释为什么这是必要的。由于 Go 还用作\转义字符,因此您需要将每个字符加倍:

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


查看完整回答
反对 回复 2023-06-05
?
阿晨1998

TA贡献2037条经验 获得超6个赞

您可以尝试//go:embed foo.sh将外部 shell 文件嵌入到您的代码中。像这样:

    //go:embed yourshell.sh
    var yourshell string

将 shell 文件放在代码的同一文件夹中。


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

添加回答

举报

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