From: Adam Akhtar on
Is it just me or is this something that just cant be done?

Ive found out that whenever system calls are made they open a child
shell process. And as soon as that call is finished the child shell is
closed and any changes that were made to the environment are lost with
it.

But i should still be able to execute source .bashrc (even though the
changes will be lost as soon as that call finishes). Instead I get
command not found. How come?

(Ubuntu 9.04 and Ruby 1.8x)
--
Posted via http://www.ruby-forum.com/.

From: Jesús Gabriel y Galán on
On Wed, Jan 27, 2010 at 10:11 AM, Adam Akhtar <adamtemporary(a)gmail.com> wrote:
> Is it just me or is this something that just cant be done?
>
> Ive found out that whenever system calls are made they open a child
> shell process. And as soon as that call is finished the child shell is
> closed and any changes that were made to the environment are lost with
> it.
>
> But i should still be able to execute source .bashrc (even though the
> changes will be lost as soon as that call finishes). Instead I get
> command not found. How come?
>
> (Ubuntu 9.04 and Ruby 1.8x)

irb(main):004:0> `echo $0`
=> "sh\n"

and sh doesn't have a source command. I remember there was a question
recently about changing the shell the backticks use, but I can't
remember the answers, maybe you can search for it in the archives?

Jesus.

From: Brian Candler on
Adam Akhtar wrote:
> Is it just me or is this something that just cant be done?
...
> (Ubuntu 9.04 and Ruby 1.8x)

In recent Ubuntu versions, the default shell is dash (/bin/sh is a link
to /bin/dash), and 'source' is not a known keyword in that shell. To
demonstrate:

$ /bin/sh
$ source /dev/null
/bin/sh: source: not found
$ exit

The solution: use '.' instead of 'source'.

dash is a POSIX-compatible shell without lots of non-standard bash
extensions. If you really need to use bash-isms, then you should invoke
bash explicitly.

>> `/bin/bash -c 'source /dev/null'`
=> ""
>>

HTH,

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

From: Adam Akhtar on
Thank you very much for both of your replies. I just tried

`/bin/bash -c 'source whatever'`

and it worked! Fantastic.

But i don't understand if source isnt a known command then how come when
i go to my command line and type source it works fine?

Thats why i was initially confused. It worked manually but not inside a
script or in irb.

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

From: Ammar Ali on
Adam Akhtar wrote:
> Thank you very much for both of your replies. I just tried
>
> `/bin/bash -c 'source whatever'`
>
> and it worked! Fantastic.
>
> But i don't understand if source isnt a known command then how come when
> i go to my command line and type source it works fine?
>
> Thats why i was initially confused. It worked manually but not inside a
> script or in irb.
>
>


source is a built-in shell command, not an executable. It is only
available from within the shell. When you go to your command line,
you're in the shell. In a ruby script, or irb, the above works because
it runs the bash shell and hands it the commands to run as a string (the
-c option).

Try running these:

$ which bash
# /bin/bash

$ which source
# returns nothing

HTH,
ammar