发现:在 Chef 食谱的 bash 中使用时缺少“-exec”的参数

find: missing argument to `-exec' when used in bash in a Chef recipe

我需要使用 bash 替换 Linux 目录下几个文件中的字符串。此命令在命令行中运行良好:

find ./ -iname '*.xml' -exec sed -i -e 's/<value>string<\/value>/<value>string01<\/value>/g' {} \;

当我尝试使用 bash 将其放入 shell 中时,出现此错误:

STDERR: find: missing argument to `-exec'

更新:我的 bash 代码在 Chef 食谱中。这是代码:

bash "change_string_dir" do
    code <<-EOH
         find ./ -iname '*.xml' -exec sed -i -e 's/<value>string<\/value>/<value>string01<\/value>/g' {} \;
    EOH
end

code<< 行更改为 code <<-'EOH'(在 EOH 周围加上单引号)。这将 disable Ruby interpretation of the string contents。 Ruby 吞下了分号前的反斜杠。示例(在 irb**... 添加):

irb(main):004:0> print <<XX     ** No single-quotes
irb(main):005:0" \;
irb(main):006:0" XX
;                               ** the backslash is gone
=> nil
irb(main):007:0> print <<'XX'   ** with single-quotes
irb(main):008:0' \;
irb(main):009:0' XX
\;                              ** the backslash is still there
=> nil

由于 Ruby 在您的 find 命令行末尾去除反斜杠分号,find 永远不会看到 -exec 参数的结尾。

编辑

对于 Ruby 不支持非插值 here-docs 的版本,请手动转义内容。例如:

find ./ -iname '*.xml' -exec sed -i -e 's/<value>string<\/value>/<value>string01<\/value>/g' {} \;
                                                         ^ extra backslashes  - - -^- - - - - - - -^

irb 例子:

irb(main):001:0> print <<-EOH   ** No quotes
irb(main):002:0" \;            ** Extra backslash
irb(main):003:0" EOH
\;                              ** The backslash is printed