setting environment variables...

D

dc

hi -

i have a ruby command line script, and i want to set/export an
environment variable thats available to other various shell scripts
that are called by this ruby...

can someone tell me how to do this?

i thot this might work, but not...

ENV[' ENV['RSWF_C'] = 1 # use c bindings'] = 1


if i use (in ruby app:)
system(" RSWF_C=1; export RSWF_C" )

is this available to all other scripts called from this master ruby script?

thanks for any help, I'm a bit lost!

/dc
 
A

ara.t.howard

You can't do that. Each call to "system()" launches a new shell interpreter,
and they don't share environments.


You cannot do this.

why not?

harp:~ > ruby -e' ENV["VAR"] = 42.to_s; system "env|grep VAR" '
VAR=42

the environment is definitely shared. did i mis-understand?

kind regards.

-a
 
A

ara.t.howard

The answer is obvious, and I provided it.

If instead his goal can be met by setting ENV variables within Ruby, then
that solves the problem. But before suggesting this, I asked that the OP
first explain what he is trying to do.

then we are both right - the OP can solve his problem, but not the way he
intended.

regards.

-a
 
E

El Gato

Paul said:
(e-mail address removed) wrote:

/ ...
You cannot do this.

why not?

harp:~ > ruby -e' ENV["VAR"] = 42.to_s; system "env|grep VAR" '
VAR=42

the environment is definitely shared. did i mis-understand?

My reply was based on his diagrammed effort to use one system call to
refer
to another system call:

The answer is obvious, and I provided it.

If instead his goal can be met by setting ENV variables within Ruby,
then
that solves the problem. But before suggesting this, I asked that the OP
first explain what he is trying to do.


Gee, I thought it was quite obvious that he was trying to export a shell
variable. Was it not at least somewhat obvious to you? His first
paragraph was relatively straightforward about that. Anyways, my point
is that you probably could've just gone ahead and given him the answer
-- it would've added a mere 20 chars (max) to your post and been at
least 100 times more helpful. I dread the day when all of the Ruby hype
turns this community into the elitist/hostile environment that exists
for so many other languages.
 
X

x1

agreed.

Works on win32 also:

irb#1(main):011:0> ENV['time'] = Time.now.to_s and system('set|find "time"')
time=Fri Nov 24 21:55:23 -0500 2006
=> true

Paul said:
(e-mail address removed) wrote:

/ ...
You cannot do this.

why not?

harp:~ > ruby -e' ENV["VAR"] = 42.to_s; system "env|grep VAR" '
VAR=42

the environment is definitely shared. did i mis-understand?

My reply was based on his diagrammed effort to use one system call to
refer
to another system call:
if i use (in ruby app:)
system(" RSWF_C=1; export RSWF_C" )
is this available to all other scripts called from this
master ruby script?

The answer is obvious, and I provided it.

If instead his goal can be met by setting ENV variables within Ruby,
then
that solves the problem. But before suggesting this, I asked that the OP
first explain what he is trying to do.


Gee, I thought it was quite obvious that he was trying to export a shell
variable. Was it not at least somewhat obvious to you? His first
paragraph was relatively straightforward about that. Anyways, my point
is that you probably could've just gone ahead and given him the answer
-- it would've added a mere 20 chars (max) to your post and been at
least 100 times more helpful. I dread the day when all of the Ruby hype
turns this community into the elitist/hostile environment that exists
for so many other languages.
 
D

dc

hi -

thanks for the help everyone.
The answer is obvious, and I provided it.
indeed you did! you remind me of a very stoic colleague :)

the background is this:

we have a server written in ruby
when it starts up it looks for some environment variables for which
mode to run in (eg using custom c extensions, or just pure ruby)

I have a completely different ruby script (for benchmarking)

so, the benchmark script needs to communicate with the server, and the
way things are setup now, this would be via environment vars.

so,

bench.rb >> sets ENV['FLAG']
calls server.rb to start up (via a system() call currently)

server.rb >> on startup, looks for the FLAG env var and decides how to run.

I tried to do some research on what exactly ENV is, within ruby, but
didnt get much out of google...its a bit too common of a word.

if i just call system() to set an env flag,
then export it
will it then be available to other processes?

any more info on ENV would also be helpful
(or where to look - i find the ruby docs really awful)
Nothing known about ENV


thanks for any help!


/dc


Paul said:
(e-mail address removed) wrote:

/ ...
You cannot do this.

why not?

harp:~ > ruby -e' ENV["VAR"] = 42.to_s; system "env|grep VAR" '
VAR=42

the environment is definitely shared. did i mis-understand?

My reply was based on his diagrammed effort to use one system call to
refer
to another system call:
if i use (in ruby app:)
system(" RSWF_C=1; export RSWF_C" )
is this available to all other scripts called from this
master ruby script?

The answer is obvious, and I provided it.

If instead his goal can be met by setting ENV variables within Ruby,
then
that solves the problem. But before suggesting this, I asked that the OP
first explain what he is trying to do.


Gee, I thought it was quite obvious that he was trying to export a shell
variable. Was it not at least somewhat obvious to you? His first
paragraph was relatively straightforward about that. Anyways, my point
is that you probably could've just gone ahead and given him the answer
-- it would've added a mere 20 chars (max) to your post and been at
least 100 times more helpful. I dread the day when all of the Ruby hype
turns this community into the elitist/hostile environment that exists
for so many other languages.


--
 
C

Curt Sampson

I tried to do some research on what exactly ENV is, within ruby, but
didnt get much out of google...its a bit too common of a word.

Check Pixaxe. Even the on-line 1st edition should have a good discussion
of ENV.
if i just call system() to set an env flag,
then export it
will it then be available to other processes?

Under Unix, the environment is a set of keywords and associated values
available to the current process. When you fork a new process (creating
a child process), it inherits a COPY of the environment of the parent
process.

system forks a new child process. So that child, if it sets an
environment variable will have access to it, as will all of its
children. The parent (your ruby script) will not be affected, nor will
any other processes that are not children of the child that set the
environment variable.

Probably best thing to do would be to find something somewhere that
explains the Unix process model; once you understand that, simple
reasoning will let you figure out what's going on and what you need to do.

Oh, and changing ENV does indeed change the environment of the current
process:

$ cat z
system('echo before: $FOO')
ENV['FOO'] = "now it's set"
system('echo after: $FOO')
$ ruby z
before:
after: now it's set
$

cjs
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top