位置参数的转义参数

位置参数的转义参数

我有外部 bash 脚本,系统调用该脚本来bash编译 golang 源代码,并且我可以配置一些变量。这个脚本是一个golang-build.eclass。该脚本中的构建函数是:

golang-build_src_compile() {
    debug-print-function ${FUNCNAME} "$@"

    ego_pn_check
    set -- env GOPATH="${WORKDIR}/${P}:$(get_golibdir_gopath)" \
        GOCACHE="${T}/go-cache" \
        go build -v -work -x ${EGO_BUILD_FLAGS} "${EGO_PN}"
    echo "$@"
    "$@" || die
}

我唯一可以从外部配置的是EGO_BUILD_FLAGS变量。

这个脚本的问题在于我尝试在EGO_BUILD_FLAGS变量中使用引号,例如:

EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""

构建脚本正在打印(使用echo)要执行的正确命令,但实际命令失败并出现错误invalid value "\"-X" for flag -ldflags。如果我只是复制打印输出并手动运行它,它就会成功完成。

以下是重现该现象的简化版本:

EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""
set -- go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
echo "$@"
"$@"

输出:

go build -x -ldflags "-X main.buildVersion=0" github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

这里的第一行是工作命令,看起来像预期的那样。看来这里的问题是,$4"-X$5main.buildVersion=0"

是否可以转义引号以将正确的构建参数作为位置参数传递set给脚本变量?

这里唯一可能的解决方案是更改EGO_BUILD_FLAGS变量,set -- ...命令不可访问,它位于外部脚本文件中。

答案1

引用很简单,您可以使用单引号而不是双引号:

EGO_BUILD_FLAGS='-ldflags "-X main.buildVersion=0"'

但这不是问题的根源:

$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

问题是您将变量的内容作为单个值传递。看看如果你运行这个会发生什么set -x

$ set -x
$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
+ go build -x -ldflags '"-X' 'main.buildVersion=0"' github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

最简单的解决方案是从变量中删除-ldflags并仅存储要传递的值-ldflags。然后您可以根据需要使用变量:

EGO_BUILD_FLAGS='-X main.buildVersion=0'
go build -x -ldflags ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap

如果这不是一个选项,您可以使用数组代替:

EGO_BUILD_FLAGS=('-ldflags' '-X' 'main.buildVersion=0')
go build -x "${EGO_BUILD_FLAGS[@]}" github.com/g4s8/gitstrap/cmd/gitstrap

最后,您可以不引用您在变量中设置的值:

EGO_BUILD_FLAGS='-ldflags -X main.buildVersion=0'

相关内容