I want ~/.bashrc
will be source
whenever changing its content. I created a bashrc class with something like this:
file { "/root/.bashrc":
ensure => present,
owner => root,
group => root,
mode => 0644,
source => "puppet:///bashrc/root/.bashrc"
}
exec { "root_bashrc":
command => "source /root/.bashrc",
subscribe => File["/root/.bashrc"],
}
but as you know, source
is a shell built-in command, thereforce I got the following error when running agent:
# puppet agent --no-daemonize --verbose
notice: Starting Puppet client version 2.7.1
info: Caching catalog for svr051-4170
info: Applying configuration version '1311563901'
err: /Stage[main]/Bashrc/Exec[root_bashrc]/returns: change from notrun to 0 failed: Could not find command 'source'
notice: Finished catalog run in 2.28 seconds
notice: Caught INT; calling stop
Is there any workaround to do this?
There's no point in re-
source
ing a new.bashrc
within Puppet, because it'll run in a subshell and the changes won't propagate into your current shell (which is, I assume, what you're trying to do). You can't do what (I think) you want to do.Technically, you could use:
However, as @womble already pointed out, there's no point in sourcing .bashrc like that; it only affects the bash shell that's run in that command, not any currently running bash shells.
You could possibly set
PROMPT_COMMAND="source /root/.bashrc"
to rerun the .bashrc every time a prompt is displayed in any currently running interactive shells, but that seems a bit resource intensive. I've never tried this, but I'd think it would work.You can also often preface your command with
true &&
or useprovider => shell
.See this and this for additional discussion.
This should be: