Làm thế nào để xuất các biến từ một tập tin?


80

Tôi có một tmp.txttệp chứa các biến được xuất, ví dụ:

a=123
b="hello world"
c="one more variable"

Làm cách nào tôi có thể xuất tất cả các biến này bằng exportlệnh, để sau này chúng có thể được sử dụng bởi các tiến trình con?


1
bash --init-file somefile.blah -c "lệnh"
Dillian Murphey

SO có một câu trả lời hữu ích về cách tự động nguồn .envtệp khi bạn cdvào một thư mục.
Dan Dascalescu

@Neerav Hãy chấp nhận câu trả lời khác. Đó là một giải pháp tốt hơn nhiều.
coderDude

Câu trả lời:


65
source tmp.txt
export a b c
./child ...

Đánh giá bằng câu hỏi khác của bạn, bạn không muốn mã hóa tên biến:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

kiểm tra nó

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
Điều này sẽ không hoạt động nếu ví dụ như tệp môi trường. (ví dụ: các tệp có thể được sử dụng lại bởi SystemFile của Systemd)
Chris Lamb

3
@ChrisLamb bạn có thể sử dụng grepđể bỏ qua các bình luận:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

182
set -a
. ./tmp.txt
set +a

set -alàm cho các biến được xác định từ bây giờ được tự động xuất. Nó có sẵn trong bất kỳ vỏ giống như Bourne. .là tên tiêu chuẩn và tên Bourne cho sourcelệnh vì vậy tôi thích nó vì tính di động ( sourcexuất phát cshvà hiện có sẵn trong hầu hết các shell giống Bourne hiện đại bao gồm cả bash(đôi khi có hành vi hơi khác)).

Trong shell POSIX, bạn cũng có thể sử dụng set -o allexportnhư một cách thay thế mô tả hơn để viết nó ( set +o allexportđể bỏ đặt).


Trong phần mềm bash, hãy cẩn thận vì nó cũng khiến tất cả các hàm được khai báo allexportsẽ được xuất ra môi trường (như BASH_FUNC_myfunction%%các biến môi trường sau đó được nhập bởi tất cả các bashshell chạy trong môi trường đó, ngay cả khi chạy như sh).


1

Cứ làm đi:

while read LINE; do export "$LINE"; done < ./tmp.txt

Bạn đã kiểm tra xem điều đó có hiệu quả không?
RalfFriedl

@RalfFriedl cái này nên hoạt động, tại sao không? Nó không phải là rất thanh lịch và tìm nguồn cung ứng set -asẽ đơn giản hơn nhiều, nhưng điều này thực sự hoạt động.
terdon

Điều này là dễ vỡ. Nó không cho phép nhận xét trong tệp đầu vào, không xử lý đúng các giá trị biến được trích dẫn và không thành công trên các biến đa dòng. Cấp cho tôi không có nhiều biến nhiều dòng, nhưng tôi thường sử dụng các bình luận và thường cần sử dụng dấu ngoặc kép cho các giá trị biến.
Louis

Nó làm việc cho tôi.
mchawre
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.