位置パラメータのエスケープパラメータ

位置パラメータのエスケープパラメータ

golangソースコードをコンパイルするためにシステムから呼び出される外部bashスクリプトがあり、bashいくつかの変数を設定できます。このスクリプトは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'

おすすめ記事