我有外部 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
,$5
是main.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'