Ruby スクリプト内から親シェルに環境変数をエクスポートするにはどうすればよいでしょうか? たとえば、read
Bash 組み込みの単純な実装を実装します。
#!/usr/bin/ruby
varname = ARGV[0]
ENV[varname] = STDIN.gets # but have varname exported to the parent process
ベストアンサー1
Ruby スクリプトが実行されるシェルに環境変数をエクスポートすることはできませんが、ソース可能な bash ファイルを作成する Ruby スクリプトを作成することはできます。
例えば
% cat set_var.rb
#!/usr/bin/env ruby
varname = ARGV[0]
puts "#{varname}=#{STDIN.gets.chomp}"
% set_var.rb FOO
1
FOO=1
% set_var.rb BAR > temp.sh ; . temp.sh
2
% echo $BAR
2
%
もう 1 つの方法は、 を使用すると、ENV[]=
Ruby プロセス内から開かれたサブシェルの環境変数が設定されます。例:
outer-bash% cat pass_var.rb
#!/usr/bin/env ruby
varname = ARGV[0]
ENV[varname] = STDIN.gets.chomp
exec '/usr/bin/env bash'
outer-bash% pass_var.rb BAZ
quux
inner-bash% echo $BAZ
quux
これをシェルのコマンドと組み合わせると、非常に強力になります。exec
このコマンドは、外側のシェルを Ruby プロセスに置き換えます (内側のシェルを終了すると、外側のシェルも自動的に終了し、「このシェルでその変数を設定したと思った」という混乱を防ぎます)。
# open terminal
% exec pass_var.rb BAZ
3
% echo $BAZ
3
% exit
# terminal closes