我正在运行go 1.8.3,并且在shell脚本中有以下命令:
go build -gcflags='-N -l'
我无法在脚本中使用引号,双引号,转义引号等解决此问题。但是,如果我的脚本中包含以下内容:
gc_flags="-gcflags='-N -l'"
echo go build "${gc_flags}"
go build "${gc_flags}"
但是,如果我从字面上复制并粘贴回显输出到我的控制台中并运行它,它就可以正常工作。
这是我从脚本中得到的错误:
flag provided but not defined: -N -l
感谢您的帮助。 。 。我不记得以前曾经在构建脚本中遇到过这样的问题。
最佳答案
这里的问题是您在变量的值中嵌入了文字单引号。
使用此值时,Shell稍后将不评估这些嵌入式单引号。
运行此命令时:
go build -gcflags='-N -l'
Shell将这些值作为命令行参数传递给
go
命令:build
-gcflags=-N -l
运行此命令时:
gc_flags="-gcflags='-N -l'"
go build "${gc_flags}"
Shell将这些值作为命令行参数传递给
go
命令:build
-gcflags='-N -l'
在第一种情况下,单引号不是第二个参数的一部分,
因为 shell 程序用单引号
'-N -l'
替换单引号表达式-N -l
。在第二种情况下,不会发生此类替换,
因为变量的内容包含单引号,
没有重新评估,
因此,单引号仍作为第二个参数的一部分。
解决此问题的一种方法是,仅将标志存储在
gc_flags
变量中,而不存储-gcflags=
gc_flags='-N -l'
go build -gcflags="$gc_flags"
这样会达到预期的效果,
因为此处
gc_flags
的值不包含单引号,在评估表达式
gc_flags='-N -l'
时将它们删除。另一种方法是使用Bash数组:
gc_flags=(-gcflags='-N -l')
go build "${gc_flags[@]}"
以这种形式,
该数组具有一个值
-gcflags=-N -l
,评估数组分配时,已删除嵌入的单引号。
关于bash - 无法使用Shell脚本中的标志运行go build,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46986532/