无法运行使用shell脚本中的标志进行构建

时间:2017-10-28 05:20:31

标签: bash shell go

我正在运行1.8.3并且我在shell脚本中有这个命令:

go build -gcflags='-N -l'

我的脚本中没有能够通过引用,双引号,转义引号等来解决这个问题。但是,如果在我的脚本中有这样的东西:

gc_flags="-gcflags='-N -l'"
echo go build "${gc_flags}"
go build "${gc_flags}"

但是如果我在控制台中复制并粘贴echo输出并运行它,它就可以正常工作。

这是我从我的脚本中得到的错误:

flag provided but not defined: -N -l

这里有任何帮助。 。 。我不记得以前曾经用过构建脚本遇到这样的问题。

2 个答案:

答案 0 :(得分:4)

这里的问题是你在变量的值中嵌入了文字单引号。 使用此值时,shell将不会在以后评估这些嵌入的单引号。

运行时:

go build -gcflags='-N -l'

shell将go命令作为命令行参数传递给build命令:

  • -gcflags=-N -l
  • gc_flags="-gcflags='-N -l'" go build "${gc_flags}"

运行时:

go

shell将build命令作为命令行参数传递给-gcflags='-N -l'命令:

  • '-N -l'
  • -N -l

在第一种情况下,单引号不是第二个参数的一部分, 因为shell使用不带引号的值gc_flags替换单引号表达式-gcflags=

在第二种情况下,没有发生这种替换, 因为变量的内容包含单引号, 没有重新评估, 所以单引号仍然是第二个参数的一部分。

解决此问题的一种方法是仅在gc_flags='-N -l' go build -gcflags="$gc_flags" 变量中存储标记,而不包含gc_flags

gc_flags='-N -l'

这会产生预期的效果, 因为此处gc_flags=(-gcflags='-N -l') go build "${gc_flags[@]}" 的值不包含单引号, 在评估表达式-gcflags=-N -l时会删除它们。

另一种方法是使用Bash数组:

time  = Time.parse(@request.created_at)
last_day = time.end_of_month.day
@mid_month = time.strftime("%Y-%m-15 %H:%M:%S")
@end_month = time.strftime("%Y-%m-#{last_day} %H:%M:%S")

在这种形式下, 数组有一个值Sub CombilnedWorkBook_and_Sheets() Dim J As Integer Dim ws As Worksheet Dim varFieldName As Variant Dim lngLoop As Long Dim rngFound As Range Dim rngCopy As Range Dim lngLastRow As Long Dim lngLastRow1 As Long Dim lngCol As Long Dim wksTarget As Worksheet Application.DisplayAlerts = False Set wksTarget = ThisWorkbook.Worksheets("Consolidated") varFieldName = Array("Patient Name", "DOB", "Admit_date", "Discharge_date", "Primary_DX_Code", "BPS PDF", "Consultation Doc", "Discharge Agreement", "EMF PDF", "Financial PDF", "ID & Insurance Card", "Lab Report PDF", "Legal History", "Medical Docs PDF", "Progress Notes PDF", "Pass Documentation", "Treatment Agreement", "Utilization Review", "User") Path = Sheet1.Range("C9").Value Filename = Dir(Path & "*.xlsx") Do While Filename <> "" Workbooks.Open Filename:=Path & Filename, ReadOnly:=True For Each Sheet In ActiveWorkbook.Sheets Sheet.Copy After:=ThisWorkbook.Sheets(1) Next Sheet Workbooks(Filename).Close savechanges:=False Filename = Dir() Loop wksTarget.Range("a1").CurrentRegion.Offset(1).ClearContents For J = 2 To Sheets.Count lngLastRow1 = wksTarget.Cells(wksTarget.Rows.Count, "A").End(xlUp).Row + 1 Sheets(J).Activate For lngLoop = 0 To UBound(varFieldName) Set rngFound = Range("A1").EntireRow.Find(varFieldName(lngLoop)) If Not rngFound Is Nothing Then lngCol = rngFound.Column lngLastRow = ActiveSheet.Cells(Rows.Count, lngCol).End(xlUp).Row With ActiveSheet.Range("A1").CurrentRegion.Columns(lngCol) Set rngCopy = .Offset(1).Resize(.Rows.Count - 1) End With rngCopy.Copy Destination:=wksTarget.Cells(lngLastRow1, lngLoop + 1) Set rngFound = Nothing Set rngCopy = Nothing lngCol = 0 lngLastRow = 0 End If Next lngLoop Next Sheets(1).Select Columns("A:Z").Select Selection.EntireColumn.AutoFit Application.DisplayAlerts = False For Each ws In Worksheets If ws.Name <> "Consolidated" And ws.Name <> "Run Macro" Then ws.Delete Next Application.DisplayAlerts = True Application.ScreenUpdating = False MsgBox "File has been coppied Successfully" End Sub , 在评估数组赋值时,已删除嵌入的单引号。

答案 1 :(得分:2)

您可以在bash脚本in this commit中看到GOGCFLAGS:

time go test std -short -timeout=$(expr 120 \* $timeout_scale)s -gcflags "$GO_GCFLAGS"

这意味着你only set the values in GO_GCFLAGS

GO_GCFLAGS="-N -l"

OP确认这是有效的:

gc=-gcflags gc_flags="-N -l" go build "${gc}" "${gc_flags}"