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?
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.
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.
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.