如果我与厨师一起运行以下食谱,则会添加条目~/.bash_profile
,但是当我这样做时echo $PATH
or 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
这里有一些事情:
Your not_if
是错的
not_if { $JAVA_HOME == "#{ENV['JAVA_HOME']}" && $PATH = "#{ENV['PATH']}:#{node['java']['path']}/bin" }
你在这里混淆了 Ruby 和 bash。在红宝石中$JAVA_HOME
指的是全局常数。我不清楚你的是什么not_if
Guard 正在努力实现这一目标,但按原样使用它肯定是不正确的。
使用 bash 代替原始资源
您正在使用 Bash 将内容回显到文件中。这是一份完美的工作file
or template
资源。这将是幂等的并正确处理通知:
file '~/.bash_profile` do
content <<-EOH
export JAVA_HOME=$JAVAHOME
export PATH=$PATH
EOH
end
但是,值得注意的是,您拥有的脚本什么也不做。您正在设置的值JAVA_HOME
and PATH
对他们自己。您可能想使用#{ENV['JAVA_HOME']}
反而。
Bash 是一个子 shell 资源
当您使用bash
(或任何执行资源),您正在子 shell 中执行,所以像source
or export
不会持久化到父进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)