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

时间:2018-05-31 12:32:19

标签: chef chef-recipe chef-solo cookbook

我正在尝试开发一个支持Windows和Linux平台的烹饪书。我在使用模板时遇到了一些问题。所以,基本上我试图把一个带有export命令的shell脚本放在一个路径上。但是我无法在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

模板

#!/bin/bash

export xyz_path = <%= @xyz_path %>

对Windows的期望

#!/bin/bash

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

Windows上的现实

#!/bin/bash

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

1 个答案:

答案 0 :(得分:0)

使用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"
)

由于反斜杠是转义字符,第一个反斜杠会转义第二个反斜杠,所以你需要重复两次才能在输出中得到两个反斜杠