Làm cách nào để lấy một biến môi trường shell trong makefile?


102

Trong vỏ khi tôi nhập

echo $demoPath

nó in

/usr/local/demo

Làm cách nào để lấy giá trị của biến này $demoPathtrong tệp makefile?

Câu trả lời:


152

Nếu bạn đã xuất biến môi trường:

export demoPath=/usr/local/demo

bạn có thể chỉ cần tham khảo nó bằng tên trong makefile( makenhập tất cả các biến môi trường mà bạn đã đặt):

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.

Nếu bạn chưa xuất biến môi trường, biến đó sẽ không thể truy cập được cho đến khi bạn xuất nó hoặc trừ khi bạn chuyển nó một cách rõ ràng trên dòng lệnh:

make DEMOPATH="${demoPath}" 

Nếu bạn đang sử dụng dẫn xuất vỏ C, hãy thay thế setenv demoPath /usr/local/democho exportlệnh.


3
"thực hiện nhập tất cả các biến môi trường bạn đã đặt". Nó hoạt động! Đẹp quá ~, tôi không biết về điều này trước đây, cảm ơn bạn rất nhiều.
Jialin

@jonathan_leffler Tôi được truyền cảm hứng từ câu trả lời của bạn và tôi đã làm điều gì đó hơi khác một chút. Tôi đặt envvar trước khi gọi thực hiện mà không xuất khẩu nó: demoPath=/usr/local/demo make. Bạn có thể muốn kiểm tra nó và có thể cập nhật câu trả lời của bạn. Chúc mừng!
sau Công nguyên

@AD Có, đó là một cơ chế khác để đặt giá trị cho một biến môi trường cho một lệnh cụ thể. Nó hơi liên quan đến câu hỏi yêu cầu làm thế nào để truy cập giá trị của một biến hiện có, hơn là cách tạo một biến một cách nhanh chóng. Đôi khi nó không ngăn nó là một kỹ thuật hữu ích.
Jonathan Leffler

10

cho những người muốn một số tài liệu chính thức để xác nhận hành vi

Các biến trong make có thể đến từ môi trường mà make được chạy. Mọi biến môi trường make thấy khi nó khởi động đều được chuyển đổi thành biến make có cùng tên và giá trị. Tuy nhiên, một phép gán rõ ràng trong makefile hoặc với một đối số lệnh, sẽ ghi đè môi trường. (Nếu cờ '-e' được chỉ định, thì các giá trị từ môi trường sẽ ghi đè các phép gán trong makefile.

https://www.gnu.org/software/make/manual/html_node/Enosystem.html


6
all:
    echo ${PATH}

Hoặc thay đổi PATH chỉ cho một lệnh:

all:
    PATH=/my/path:${PATH} cmd
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.