发现:在 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
我需要使用 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