How do I export an environment variable from within a Ruby script to the parent shell? For example, implementing a naïve implementation of the read
Bash builtin:
#!/usr/bin/ruby varname = ARGV[0] ENV[varname] = STDIN.gets # but have varname exported to the parent process
To pass environment variables to Ruby, simply set that environment variable in the shell. This varies slightly between operating systems, but the concepts remain the same. To set an environment variable on the Windows command prompt, use the set command.
To export a environment variable you run the export command while setting the variable. We can view a complete list of exported environment variables by running the export command without any arguments. To view all exported variables in the current shell you use the -p flag with export.
You store separate environment variables in config/development. rb , config/testing. rb and config/production. rb respectively.
You can't export environment variables to the shell the ruby script runs in, but you could write a ruby script that creates a source-able bash file.
For example
% echo 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 %
Another alternative is that using ENV[]=
does set environment variables for subshells opened from within the ruby process. For example:
outer-bash% echo 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
This can be quite potent if you combine it with the shell's exec
command, which will replace the outer-shell with the ruby process (so that when you exit the inner shell, the outer shell auto-exits as well, preventing any "I thought I set that variable in this shell" confusion).
# open terminal % exec pass_var.rb BAZ 3 % echo $BAZ 3 % exit # terminal closes
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With