我有外部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 = in =
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 -- ...命令是不可访问的,它位于外部脚本文件中。
发布于 2019-02-24 18:30:20
引用很简单,您可以使用单引号而不是双引号:
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 = in =
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 = in =
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'https://unix.stackexchange.com/questions/502715
复制相似问题