8

シェルスクリプトを作成していて、環境をセットアップするためにいくつかの外部(c-)シェルスクリプトを「調達」したい場合は、次のように呼び出すことができます。

source /file/I/want/to/source.csh

これを行うシェルスクリプトをrubyスクリプトに置き換えたいと思います。ルビースクリプトで同様のことを行うことはできますか?

アップデート:

test_script.cshで試してみました:

#!/bin/csh

setenv HAPPYTIMES True

...およびtest_script.rb:

#!/usr/bin/env ruby
system "~/test_script.csh"
system "echo $HAPPYTIMES"

残念ながら、現時点ではHAPPYTIMESはありません。

4

6 に答える 6

5

これが機能しない理由は、b /crubyがsystemコマンドを別々のシェルで実行するためです。したがって、1つのシステムコマンドが終了すると、ファイルを提供していたシェルが閉じ、そのシェルに設定されている環境変数はすべて忘れられます。

実行時までソースファイルの名前がわからない場合は、Roboprogの答えが適切なアプローチです。ただし、ソースファイルの名前を事前に知っている場合は、hashbang行を使用して簡単にハックすることができます。

% echo sourcer.rb
#!/usr/bin/env ruby
exec "csh -c 'source #{ARGV[0]} && /usr/bin/env ruby #{ARGV[1]}'"
% echo my-script.rb
#!/usr/bin/env ruby sourcer.rb /path/to/file/I/want/to/source.csh
puts "HAPPYTIMES = #{ENV['HAPPYTIMES']}"
% ./my-script.rb
HAPPYTIMES = True

これらはすべて、rubyスクリプトで設定された環境変数を使用するのに役立つだけであり、シェルに設定するのには役立ちません(rubyプロセスが完了するとすぐに忘れられるため)。そのため、あなたはsourceコマンドで立ち往生しています。

于 2009-07-29T14:45:25.553 に答える
3

私は同じ問題を抱えていました。そして、私は以下のように解決します。

#!/usr/local/bin/ruby

def source(filename)
  ENV.replace(eval(`tcsh -c 'source #{filename} && ruby -e "p ENV"'`))
end

p "***old env*****************************"
p ENV
source "/file/I/want/to/source.csh"
p "+++new env+++++++++++++++++++++++++++++"
p ENV

「eval」は非常に強力なメソッドです。プロセスを簡単に飛び越えます。

于 2014-10-15T11:25:52.470 に答える
1

次のような関数を実行し、出力をキャプチャする必要があります(「バックティック」操作)。

/bin/csh -e '. my_script ; env'

各行をループし、次のようなものと照合します

/^(\w+)=(.*)$/

次に、最初の一致キャプチャを変数名として使用し、2番目のキャプチャを変数値として使用します。

(はい、私はPerlをRubyよりもよく知っているという事実をヘッジしていますが、アプローチは同じです)

于 2009-07-29T00:49:27.713 に答える
-4
system 'source /file/I/want/to/source.sh'

しかし、これがあなたが望むことをするかどうかはわかりません。サブシェルでソースコマンドを実行します。それを試してみて、それがあなたが求めていることを実行することを確認してください。

于 2009-07-29T00:22:37.550 に答える