如果我使用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
答案 0 :(得分:4)
这里有一些事情:
not_if
错误not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }
你在这里混淆Ruby和bash。 IN Ruby $JAVA_HOME
指的是全局常量。我不清楚你的not_if
后卫试图完成什么,但按原样使用它肯定是不正确的。
您正在使用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中执行,因此source
或export
之类的内容不会持久保存到父进程。