Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t将bash命令嵌入到厨师食谱中_Bash_Chef Infra - Fatal编程技术网

Can';t将bash命令嵌入到厨师食谱中

Can';t将bash命令嵌入到厨师食谱中,bash,chef-infra,Bash,Chef Infra,我试图在我的厨师食谱中嵌入一个shell命令,但是当厨师执行该命令时,它似乎出错了。以下是相关资源: script "create libs symlink" do interpreter "bash" user "root" cwd "/home/robin/test" code <<-EOH ln -s $(ls -1 | grep '^[0-9.-]\+$') curr-version-libs EOH end 看起来$(ls-1 | grep'^[0-9

我试图在我的厨师食谱中嵌入一个shell命令,但是当厨师执行该命令时,它似乎出错了。以下是相关资源:

script "create libs symlink" do
  interpreter "bash"
  user "root"
  cwd "/home/robin/test"
  code <<-EOH
ln -s $(ls -1 | grep '^[0-9.-]\+$') curr-version-libs
  EOH
end
看起来$(ls-1 | grep'^[0-9.-]+$)正在被删除,我将使用命令
ln-s curr version libs


有人知道这里发生了什么吗?我尝试过使用
execute
资源,但得到了相同的结果。

您尝试过转义美元符号吗

ln -s \$(ls -1 | grep '^[0-9.-]\+$') curr-version-libs

如果您的19.26-3目录在chef run开始之前就存在,那么就很容易了。如果您正在创建一个符号链接,我建议使用link资源

version = `ls /home/robin/test/ -1 | grep '^[0-9.-]+$'`.strip

link "/home/robin/test/curr-version-libs" do
  to ::File.join( "/home/robin/test", version )
end
但如果没有,我建议使用ruby_块并动态定义链接资源

ruby_block "create libs symlink" do
  block do
    version = `ls /home/robin/test/ -1 | grep '^[0-9.-]+$'`.strip
    res = Chef::Resource::Link.new( "/home/robin/test/curr-version-libs", run_context )
    res.to ::File.join( "/home/robin/test", version )
    res.run_action :create
  end
end

编辑:在按照Robin的建议分配到版本之前,我通过修复正则表达式和调用strip更正了答案。

似乎您正在调用shell来创建sym链接。在这种情况下,更好的方法是使用。我永远不会使用脚本或执行资源来做您正在做的事情

使用链接资源,您可以执行以下操作:

  link "/home/robin/test/curr-version-libs" do
    to '/home/robin/test/19.26-3'
    user 'root'
    group 'root'
    link_type :symbolic 
    action :create
  end
一个简短的旁白:我已经指导和辅导了很多人来学习厨师。那些理解了资源、提供者和轻量级资源(aka.LWRPs)提供了什么的人比那些只想把旧的shell脚本放到烹饪书中的人更快乐、更有效


我强烈建议您阅读和文档

是的,我已经尝试过两种方法,但没有区别。我也尝试过使用backticks,同样,如果
grep
在命令运行时与任何内容都不匹配,那么扩展将被有效删除。您确定该目录当时存在,并且以后不是由另一个厨师菜谱创建的吗?您可以执行
ls-l>ls\u快照
,然后检查ls\u快照以查看当时有哪些文件。这样看起来可以正常工作-我明天试一试,现在告诉您我的进展情况。谢谢好的,你的第二个建议结果是赢家——第一个以错误的顺序执行。此外,我还必须从正则表达式中删除反斜杠,并且必须执行
version=version.delete(“\n”)
,以从链接名中删除拖尾垃圾。再次感谢!为什么只建议对符号链接使用链接资源?此外,使用Ruby Core或标准库类,代码中执行的所有命令行操作都可以更容易地以可移植的方式执行。我从来没有说过,我只建议将其用于符号链接。这是创建任何链接的方法,甚至在windows节点上也是如此。关于命令行操作,可以使用Ruby执行。我不太擅长ruby,只是复制了操作代码。我想你可以详细说明一下,并提供你自己对这个问题的答案。
  link "/home/robin/test/curr-version-libs" do
    to '/home/robin/test/19.26-3'
    user 'root'
    group 'root'
    link_type :symbolic 
    action :create
  end