2012-02-19 24 views
5

thể trùng lặp:
Exporting an Environment Variable in RubyCó thể xuất thuộc tính môi trường từ tập lệnh ruby ​​không?

Tôi cần phải thiết lập một số thuộc tính môi trường từ bên trong kịch bản ruby.

Thông thường, trong bash, tôi làm như sau:

$ export SOME_VAR=some_value 

Nhưng trong ruby, sau (rõ ràng) không hoạt động:

irb(main):002:0> `export SOME_VAR=some_value` 
(irb):2: command not found: export ASDF=1 
=> "" 

Có cách nào để làm điều đó?

+1

Âm thanh này ngược lại với tôi. Bạn đang cố gắng đạt được điều gì? –

+0

@ JensTinfors tôi chỉ sử dụng điều này trong một kịch bản ruby ​​mà làm cho một số lệnh shell, một trong số đó hy vọng một biến môi trường cụ thể được thiết lập. Nếu tôi đã làm nó trong một kịch bản bash tôi sẽ sử dụng 'xuất khẩu', nhưng điều này sẽ không hoạt động thông qua một lệnh shell ruby ​​(backticks hoặc hệ thống). Dường như làm việc tốt bằng cách sử dụng ENV như câu trả lời nói, vì vậy điều này rất có giá trị đối với tôi. –

+0

@MaxWilliams Chỉ các biến môi trường mà bạn thiết lập sẽ chỉ ở đó cho quy trình hiện tại. Bởi ngược lại tôi có nghĩa là môi trường thuộc về vỏ, quá trình ruby ​​là một subprocess của vỏ, xem những gì tôi có ý nghĩa? :) –

Trả lời

8

Theo http://ruby.about.com/od/rubyfeatures/a/envvar.htm, bạn chỉ có thể viết:

ENV['SOME_VAR'] = 'some_value' 
+1

NB: điều này sẽ thiết lập biến môi trường cho quy trình Ruby hiện tại cũng như bất kỳ tiến trình con nào (ví dụ: bạn tạo bằng 'hệ thống' hoặc dấu gạch chéo ngược). –

+0

@KyleBurton: Vâng, tuyệt đối. Tôi cho rằng đó chính xác là những gì OP muốn, nhưng tôi có thể sai. – ruakh

1

Thử `ENV ['SOME_VAR'] = 'some_value'.

Bạn không thể thực hiện các tác động của việc này tồn tại trong môi trường thực thi tập lệnh, sau khi tập lệnh hoàn tất.

Bí quyết được thảo luận trong nhận xét cho câu trả lời của tôi là in mã shell hợp lệ vào bảng điều khiển, từ tập lệnh ruby ​​của bạn - đây là không những gì bạn cần, nhưng có thể hữu ích khi biết cũng vậy.

$ echo "puts 'export foo=bar'" > test.rb 
$ echo $foo 

$ source <(ruby test.rb) 
$ echo $foo 
bar 
+1

Tôi thực sự không nghĩ rằng 'nguồn./My_script.rb' có thể được thực hiện để làm việc. Hãy suy nghĩ về nó - cho những gì bạn đang nói là đúng, kịch bản Ruby sẽ phải chạy trong tiến trình tương tự như vỏ Bash hiện có, và sau đó, khi kịch bản lệnh Ruby kết thúc, quá trình sẽ phải trở lại Bash shell. – ruakh

+0

Hình dạng của shebang trong trường hợp này là gì? –

+0

Bạn có thể 'nguồn' đầu ra của một chương trình với bash như thế này: 'source <(./ my_script.rb)' –

1

Nếu bạn không muốn giá trị này có thể lưu sau khi kịch bản kết thúc, bạn có thể thay đổi ENV trực tiếp.

ENV['SOME_VAR'] = 'some_value' 
puts ENV['SOME_VAR'] 
# => some_value 

Nếu bạn làm muốn kiên trì, sau đó bạn có thể (ngoài này) phải viết var này cho một người ~/.bashrc hoặc tương tự file trên hệ thống của bạn.

Các vấn đề liên quan