如果我使用chef运行下面的配方,条目将在~/.bash_profile
中添加,但是当我执行echo $PATH
或echo $JAVA_HOME
时,命令行返回空白值。这是怎么回事?
ruby_block "set-env-java-home" do
block do
ENV["JAVA_HOME"] = node['java']['path']
ENV['PATH'] = "#{ENV['PATH']}:#{node['java']['path']}/bin"
end
not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }
end
bash 'set-env-bashrc' do
code <<-EOH
echo -e "export JAVA_HOME=$JAVA_HOME" >> ~/.bash_profile
echo -e "export PATH=$PATH" >> ~/.bash_profile
source ~/.bash_profile
EOH
end
这里有几件事:
你的not_if
是错误的
not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }
你把Ruby和bash搞混了。在Ruby中,$JAVA_HOME
指的是一个全局常量。我不清楚你的not_if
守卫想要完成什么,但按原样使用肯定是不正确的。
使用bash代替原始资源
您正在使用Bash将内容回显到文件中。这是file
或template
资源的完美工作。将是幂等的,并正确处理通知:
file '~/.bash_profile` do
content <<-EOH
export JAVA_HOME=$JAVAHOME
export PATH=$PATH
EOH
end
然而,值得注意的是,您所拥有的脚本什么也不做。将JAVA_HOME
和PATH
的值设置为自己的值。您很可能想使用#{ENV['JAVA_HOME']}
。
Bash是一个子shell资源
当您使用bash
(或任何执行资源)时,您是在子shell中执行的,因此像source
或export
这样的东西不会持久化到父进程。