From: Brian Candler 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?

because your login shell is /bin/bash not /bin/sh (grep for your
username in /etc/passwd)

The correct solution is not to use bash-specific functionality:

`. whatever`

should work just fine. By doing this you'll help your script to be
portable to other operating systems, like *BSD which tend not to install
bash by default because of its restrictive GPL licence.

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

From: Brian Candler on
Ammar Ali wrote:
> source is a built-in shell command, not an executable. It is only
> available from within the shell.

You are correct, but you've missed the point. As the OP already
observed, ruby *does* invoke a shell when you pass it a string in
backticks.

The point is that his default shell doesn't have a 'source' builtin.

`source /dev/null` # fails (not a POSIX shell feature)
`. /dev/null` # works

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

From: Phil Romero on
[Note: parts of this message were removed to make it a legal post.]

On Wed, Jan 27, 2010 at 2:04 AM, Ammar Ali <ammarabuali(a)gmail.com> wrote:

> 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
>
>
>
Another good tool to use is 'type' when trying to puzzle this stuff out:

[pdr(a)grace]$ type source
source is a shell builtin
[pdr(a)grace]$ type .
is a shell builtin

From: Adam Akhtar on
Many thanks for your replies again - most helpful and greatly
appreciated. Saved a few hours of my hitting my head against a brick
wall.


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

From: Seebs on
On 2010-01-27, 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?

External shell almost always uses /bin/sh, which is usually more POSIXY,
and "source" is a bash-only feature. Try ". $HOME/.bashrc" or something
close to that -- the "." command often requires a path to reach things
in the current directory, to avoid certain obvious failure modes.

-s
--
Copyright 2010, all wrongs reversed. Peter Seebach / usenet-nospam(a)seebs.net
http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures
http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated!