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?
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.
···
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?
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.
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
···
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?
--
Copyright 2010, all wrongs reversed. Peter Seebach / usenet-nospam@seebs.net | Seebs.Net <-- lawsuits, religion, and funny pictures Fair game (Scientology) - Wikipedia <-- get educated!
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).
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.
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
···
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).