Các tham số thoát cho các đối số vị trí


3

Tôi có tập lệnh bash bên ngoài được hệ thống gọi bashđể biên dịch các nguồn golang và tôi có thể định cấu hình một số varialbes. Kịch bản này là một golang-build.eclass . Hàm xây dựng trong tập lệnh này là:

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
}

Điều duy nhất tôi có thể cấu hình từ bên ngoài là EGO_BUILD_FLAGSbiến.

Vấn đề với tập lệnh này là khi tôi đang cố gắng sử dụng dấu ngoặc kép trong EGO_BUILD_FLAGSbiến, ví dụ:

EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""

tập lệnh xây dựng đang in (với echo) lệnh chính xác để thực thi nhưng lệnh thực tế bị lỗi invalid value "\"-X" for flag -ldflags. Nếu tôi chỉ sao chép đầu ra được in và chạy thủ công thì nó đã hoàn thành thành công.

Đây là phiên bản đơn giản hóa để tái tạo nó:

EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""
set -- go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
echo "$@"
"$@"

đầu ra:

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.

Dòng đầu tiên ở đây là lệnh làm việc và trông giống như mong đợi. Có vẻ như vấn đề ở đây $4"-X$5đang có main.buildVersion=0".

Có thể thoát dấu ngoặc kép để truyền tham số xây dựng chính xác dưới dạng đối số vị trí đến settừ biến tập lệnh không?

Giải pháp khả thi duy nhất ở đây là thay đổi EGO_BUILD_FLAGSbiến, set -- ...lệnh không truy cập được, nó nằm trong tệp script bên ngoài.


2
Bạn đã gặp phải sự hạn chế của giao điểm đáng tiếc của việc xử lý đối số dòng lệnh công cụ được hiểu kém (Go-lang) với hệ thống xây dựng thiển cận dựa trên ngôn ngữ hệ vỏ (Gentoo.) Xin lỗi nếu tôi nghe có vẻ khó chịu, nhưng tôi tôi đã phải đối phó với cả hai và tôi cũng không quan tâm ... Đề nghị của tôi là bạn mở một báo cáo lỗi / yêu cầu tính năng với Gentoo, yêu cầu họ mở rộng eclass của họ cho Golang để thực sự có thể vượt qua bất kỳ hình thức nào -ldflagsđối với các bản dựng Golang, vì khi nó đứng, điều này thực sự không thể. Chúc may mắn!
filbranden

1
Đối với tôi có vẻ như cách duy nhất điều này có thể được thực hiện để làm việc là cho kính viễn vọng được sửa đổi để sử dụng evalđể mở rộng EGO_BUILD_FLAGS. Tức là, có vẻ như hành vi đó đã được dự định nhưng bị lãng quên. Nó thường được coi là thực hành xấu, nhưng, bây giờ, có lẽ bạn sẽ phải đơn giản xác định src_compile()trực tiếp trong .ebuildthay vì gọi hàm được cung cấp bởi eclass.
b Liệu

1
@binki bạn nói đúng, tôi đã tìm thấy một lỗi bug.gentoo.org/583238 nhưng nó đã được gửi vào năm 2016 và nó vẫn mở.
g4s8

Câu trả lời:


1

Việc trích dẫn rất đơn giản, bạn chỉ có thể sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép:

EGO_BUILD_FLAGS='-ldflags "-X main.buildVersion=0"'

Nhưng đó không phải là nguồn gốc của vấn đề:

$ 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.

Vấn đề là bạn đang truyền nội dung của biến dưới dạng một giá trị. Xem những gì sẽ xảy ra nếu bạn chạy nó với 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.

Giải pháp đơn giản nhất là loại bỏ -ldflagskhỏi biến của bạn và chỉ lưu trữ các giá trị bạn muốn vượt qua -ldflags. Sau đó, bạn có thể sử dụng biến của mình như bạn muốn:

EGO_BUILD_FLAGS='-X main.buildVersion=0'
go build -x -ldflags ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap

Nếu đó không phải là một tùy chọn, bạn có thể sử dụng một mảng thay thế:

EGO_BUILD_FLAGS=('-ldflags' '-X' 'main.buildVersion=0')
go build -x "${EGO_BUILD_FLAGS[@]}" github.com/g4s8/gitstrap/cmd/gitstrap

Cuối cùng, bạn không thể trích dẫn các giá trị bạn đặt trong biến:

EGO_BUILD_FLAGS='-ldflags -X main.buildVersion=0'

1
Cảm ơn câu trả lời, nhưng tôi không thể chuyển -ldflagstừ biến, vì hàm xây dựng nằm trong tệp tập lệnh bên ngoài mà tôi không thể sửa đổi.
g4s8

@ g4s8 OK, xem câu trả lời cập nhật. Một mảng sẽ làm việc cho bạn.
terdon

mảng cũng không phải là một giải pháp cho tôi, bởi vì điều duy nhất tôi có thể sửa đổi là EGO_BUILD_FLAGSbiến. Trong ví dụ mảng, bạn đã thay đổi go buildlệnh (được thêm [@]vào EGO_BUILD_FLAGS) mà tôi không thể truy cập.
g4s8

@ g4s8 vui lòng chỉnh sửa câu hỏi của bạn và làm rõ những hạn chế này. Chúng tôi cần biết những hạn chế nào chúng tôi đang làm việc để chúng tôi không lãng phí thời gian của bạn và chúng tôi sẽ đưa ra các phương pháp không phù hợp với bạn. Điều đó nói rằng, nó không hoạt động nếu bạn chỉ làm EGO_BUILD_FLAGS='-ldflags -X main.buildVersion=0'? Mà không trích dẫn?
terdon

xin lỗi nếu nó không rõ ràng, tôi nghĩ rằng nó đủ để nói rằng tiền điện tử là bên ngoài và được gọi bởi hệ thống. Không "-X main.buildVersion=0"là một giá trị duy nhất cho -ldflagsđối số, nó cũng có thể được chia sẻ lại thành-ldflags="-X main.buildVersion=0"
g4s8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.