2010-01-26 11 views
5

Ruby programımdan bazı üçüncü parti bash komut dosyalarını çalıştırmaya çalışıyorum.Ruby komut dosyasında bir komut kabuğu için ortam değişkenlerini nasıl kaynak yaparım?

Onları çalıştırabilmek için önce bir dosya göndermemi şart koşuyorlar. Komut satırında her şey iyi çalışıyor ama Ruby içinde çalışmıyor. Sistem komutlarının yeni bir çocuk kabuğu işlemi açacağını ve Ruby kaynak kodunu çalıştıran ana kabuk işleminden görülemeyeceğini ve bunun için herhangi bir kaynak oluşturmaya gideceğimi öğrendim. Sistem çağrısı bittiğinde, çocuk kabuğu da öldürülür.

Bu sorunu nasıl çözebilirim?

cevap

7

yapın:

$ source whatever.sh 
$ set > variables.txt 

Ve sonra Ruby'de:

File.readlines("variables.txt").each do |line| 
    values = line.split("=") 
    ENV[values[0]] = values[1] 
end 

Bunu çalıştırdıktan sonra ortamınızın iyi gitmesi gerekir.

#!/usr/bin/env bash 
eval $(echo "$(cat .env) $1" | tr '\n' ' ') 

Ben daha sonra ~/bin/run_with_env.sh bu koyup: Bir dosyayı yazmak veya bu şeylerle benim yakut kodunu karıştırmak zorunda kalmak istemediği için

+0

Bunu dene. Yani bu, komut dosyasının içerdiği kabuk işleminin çevre değişkenlerini değiştirebileceği anlamına gelir ve bu nedenle sistem üzerinden yapılan diğer tüm süreçler miras olarak kalıyor? – robodisco

+1

Hayır, ancak Ruby komut dosyasından yürütülen herhangi bir işlem komut dosyasının değişkenlerini devralır. – Geo

+0

Yukarıdaki tek bir iş parçacığı için çalışır ve ben aşağıda. Ancak bir soru IO.popen ile ortamın birleştirilmiş KOPYASINI nasıl kullanırım? Bir şekilde işe yaramaz gibi görünüyor. "Sistem" ile: Bunu yapabilirim: # ... yeni "yol" oluştur subEnv = Hash.new; subEnv.merge! (ENV); # eski ortamı kopyala subEnv ['PATH'] = yol; # sistemindeki yeni değerleri ayarlayın (subEnv, commandLine); – peterk

2

Sorunuzu doğru anladıysam emin değilim. Başka birisini çalıştırmadan önce bir kabuk komut dosyası oluşturmaya çalışıyor musunuz? Bu durumda Cevap basit: kaynak dosya komut bunları export zorunda kullanması gereken değişkenleri içeren

#!/bin/env ruby 
system "source <path_to_source_file> && <command>" 

edin. Ruby betiğinizdeki ortam değişkenlerini ENV['<name_of_var>'] = <value> kullanarak da ayarlamak mümkündür.


Güncelleme: 26 Ocak 2010 - 15:10

Yeni kabuk açmak için IO.popen kullanabilirsiniz

:

IO.popen("/bin/bash", "w") do |shell| 
    shell.puts "source <path_to_source_file>" 
    shell.puts "<command>" 
end 
+0

Ben vars sadece bu komutu çalıştırmak için kökenli alır kabuk işlemi için ayarlanacak çünkü sistemi ile yürütülmesi, yardımcı olacağını sanmıyorum. – Geo

+0

Kullanıcı dizimdeki "source .bashrc" sistemini bile alamıyorum. Komut bulunamadı şikayet ediyor. Gönderdiğiniz gibi kaynağın kullanılabileceğinden emin misiniz? – robodisco

+0

Benim için çalıştı. Bunu OSX 10.6'da denedim. Komut dosyasını/bin/bash komutunu çalıştıran kullanıcının kabuğu mı? (Ayrıca cevabımı da güncelledim.) – t6d

0

Bunu yapan Bu korkunç

% run_with_env.sh "rails console" 
2

ama ..

env = %x{. /some/shell/script/which/setups/your/env && env} 
env.split("\n").each do |line| 
    key, value = line.split("=", 2) 
    ENV[key] ||= value unless value.nil? or value.empty? 
end 
0

değiştirme ENV tek bir iş parçacığı için çalışır ve ben bel yapın: örnek ı çalıştırabilirsiniz Bunun yerine ow. Ancak bir soru IO.popen ile ortamın birleştirilmiş KOPYASINI nasıl kullanırım? Bir şekilde işe yaramaz gibi görünüyor. "Sistem" ile

Yapabileceğim:

# ... create new "path" here 

    subEnv = Hash.new; 
    subEnv.merge!(ENV); # copy old environment 
    subEnv['PATH'] = path; # set new values in copy 

    system(subEnv, commandLine); 
İlgili konular