Why does `source .bashrc` complain "command not found"?

  • Follow


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

0
Reply Adam 1/27/2010 9:11:22 AM

On Wed, Jan 27, 2010 at 10:11 AM, Adam Akhtar <adamtemporary@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.

0
Reply ISO 1/27/2010 9:23:24 AM


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

0
Reply Brian 1/27/2010 9:28:56 AM

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

0
Reply Adam 1/27/2010 9:38:30 AM

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


0
Reply Ammar 1/27/2010 10:04:52 AM

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

0
Reply Brian 1/27/2010 10:14:46 AM

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

0
Reply Brian 1/27/2010 10:17:15 AM

[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@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@grace]$ type source
source is a shell builtin
[pdr@grace]$ type .
 is a shell builtin

0
Reply Phil 1/27/2010 10:18:52 AM

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

0
Reply Adam 1/27/2010 10:21:43 AM

On 2010-01-27, Adam Akhtar <adamtemporary@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@seebs.net
http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures
http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated!
0
Reply Seebs 1/27/2010 10:56:55 PM

9 Replies
2784 Views

(page loaded in 0.102 seconds)

Similiar Articles:













7/19/2012 4:59:24 PM


Reply: