Setting environment variables

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

···

-------------------------------------------
      David "DC" Collier
mailto:dc@pikkle.com
      +81 (0)80 6521 9559
      skype: callto://d3ntaku
-------------------------------------------
      Pikkle 株式会社
      http://www.pikkle.com
-------------------------------------------

dc wrote:

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...

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

can someone tell me how to do this?

You cannot 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?

No.

Now, please tell us what problem you are trying to solve, rather than
evaluate this approach to solving it.

···

--
Paul Lutus
http://www.arachnoid.com

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

···

On Sat, 25 Nov 2006, Paul Lutus wrote:

dc wrote:

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...

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

can someone tell me how to do this?

You cannot do this.

--
if you want others to be happy, practice compassion.
if you want to be happy, practice compassion. -- the dalai lama

/ ...

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.

···

ara.t.howard@noaa.gov wrote:

--
Paul Lutus
http://www.arachnoid.com

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

regards.

-a

···

On Sat, 25 Nov 2006, Paul Lutus wrote:

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.

--
if you want others to be happy, practice compassion.
if you want to be happy, practice compassion. -- the dalai lama

Paul Lutus 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.

···

ara.t.howard@noaa.gov wrote:

--
Posted via http://www.ruby-forum.com/\.

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

···

On 11/24/06, El Gato <wmwilson01@gmail.com> wrote:

Paul Lutus wrote:
> ara.t.howard@noaa.gov 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.

--
Posted via http://www.ruby-forum.com/\.

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 :slight_smile:

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)

ri ENV

Nothing known about ENV

thanks for any help!

/dc

···

On 25/11/06, El Gato <wmwilson01@gmail.com> wrote:

Paul Lutus wrote:
> ara.t.howard@noaa.gov 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.

--
Posted via http://www.ruby-forum.com/\.

--
-------------------------------------------
      David "DC" Collier
mailto:dc@pikkle.com
      +81 (0)80 6521 9559
      skype: callto://d3ntaku
-------------------------------------------
      Pikkle 株式会社
      http://www.pikkle.com
-------------------------------------------

I agree that we are both right, but you are at least 10% more right than I
am. :slight_smile:

I should have read his post more carefully -- I didn't spend enough time on
it.

···

ara.t.howard@noaa.gov wrote:

On Sat, 25 Nov 2006, Paul Lutus wrote:

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.

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

--
Paul Lutus
http://www.arachnoid.com

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

···

On Sat, 25 Nov 2006, dc wrote:
--
Curt Sampson <cjs@cynic.net> +81 90 7737 2974
   The power of accurate observation is commonly called cynicism
   by those who have not got it. --George Bernard Shaw