Chef infra 如何将带有双斜杠的属性值传递给模板

Chef infra 如何将带有双斜杠的属性值传递给模板,chef-infra,chef-recipe,chef-solo,cookbook,Chef Infra,Chef Recipe,Chef Solo,Cookbook,我正在尝试开发一本食谱,它将同时支持Windows和Linux平台。我在使用模板时遇到一些问题。因此,基本上我尝试放置一个shell脚本,它将有一个带有路径的export命令。但是我无法在windows上获得shell脚本的确切值 属性: root_path = value_for_platform( 'windows' => { 'default' => "D:\\" }, 'default' => '/opt' ) xyz_path = value_for_plat

我正在尝试开发一本食谱,它将同时支持Windows和Linux平台。我在使用模板时遇到一些问题。因此,基本上我尝试放置一个shell脚本,它将有一个带有路径的
export
命令。但是我无法在windows上获得shell脚本的确切值

属性:

root_path = value_for_platform(
  'windows' => { 'default' => "D:\\" },
  'default' => '/opt'
)
xyz_path = value_for_platform(
  'windows' => { 'default' => "#{root_path}xyz_app\\tool\\bin\\xyz.bat" },
  'default' => "#{root_path}/xyz_app//tool//bin//xyz"
)
template File.join(root_path, '/tmp/xyz_path.sh') do
  source 'xyz_path.sh.erb'
  mode '0755'
  variables({
    :xyz_path => xyz_path
  })
end
配方:

root_path = value_for_platform(
  'windows' => { 'default' => "D:\\" },
  'default' => '/opt'
)
xyz_path = value_for_platform(
  'windows' => { 'default' => "#{root_path}xyz_app\\tool\\bin\\xyz.bat" },
  'default' => "#{root_path}/xyz_app//tool//bin//xyz"
)
template File.join(root_path, '/tmp/xyz_path.sh') do
  source 'xyz_path.sh.erb'
  mode '0755'
  variables({
    :xyz_path => xyz_path
  })
end
模板

#!/bin/bash

export xyz_path = <%= @xyz_path %>
Windows上的现实

#!/bin/bash

export xyz_path = D:\\xyz_app\\tool\\bin\\xyz.bat
#!/bin/bash

export xyz_path = D:\xyz_app\tool\bin\xyz.bat

用4个反斜杠得到你想要的

root_path = value_for_platform(
  'windows' => { 'default' => "D:\\\\" },
  'default' => '/opt'
)
xyz_path = value_for_platform(
  'windows' => { 'default' => "#{root_path}xyz_app\\\\tool\\\\bin\\\\xyz.bat" },
  'default' => "#{root_path}/xyz_app//tool//bin//xyz"
)
由于反斜杠是转义字符,第一个反斜杠将转义第二个字符,因此需要重复此操作两次,以便在输出中获得两个反斜杠