Ruby chef-recipe中unix命令的输出

Ruby chef-recipe中unix命令的输出,ruby,unix,chef-infra,Ruby,Unix,Chef Infra,我在厨师食谱中有一个execute命令,我想将cwd属性设置为unix命令的输出 执行“运行动态生成的安装文件”执行 命令“makeinstall” cwd“”#希望输出'ls-Adrt/tmp/unixODBC.*| tail-n1` 结束 这可能吗?您应该可以这样做: execute 'run dynamically generated install file' do command 'make install' cwd `ls -Adrt /tmp/unixODBC.*

我在厨师食谱中有一个
execute
命令,我想将
cwd
属性设置为unix命令的输出

执行“运行动态生成的安装文件”执行
命令“makeinstall”
cwd“”#希望输出'ls-Adrt/tmp/unixODBC.*| tail-n1`
结束

这可能吗?

您应该可以这样做:

execute 'run dynamically generated install file' do
    command 'make install'
    cwd `ls -Adrt /tmp/unixODBC.* | tail -n 1`
end

这似乎超出了
execute
块的范围

也许只需要使用一个
ruby_块

ruby_block 'run dynamically generated install file' do
    require 'mixlib/shellout'
    block do
        cmd = Mixlib::ShellOut.new('make install')
        cmd.run_command
        cwd = cmd.stdout
        # Do more stuff with cwd...
    end
end

好的,最后在一个键盘上,可以完整地写出来

你所拥有的东西的直译应该是:

execute 'run dynamically generated install file' do
    command 'make install'
    cwd lazy { shell_out!('ls -Adrt /tmp/unixODBC.* | tail -n 1').stdout.strip }
end
但是,这将比需要的慢得多,而且更容易发生故障,因此我建议用Ruby编写:

execute 'run dynamically generated install file' do
    command 'make install'
    cwd lazy { Dir['/tmp/unixODBC.*'].first }
end

这避免了产生一堆进程,而是直接执行相同的(我认为)逻辑。

非常简单。谢谢@eikoDon,别那么做。您正在使用chef资源中的ruby代码。这可能会在很多方面失败。这是非常不推荐的,因为Ruby的命令执行非常容易出错,而且对某些事情没有错误处理fails@Tensibai“同意,这不是一个安全的方法。”coderanger承认,我在这里是作为一个非常了解ruby的人,而不是一个非常了解chef的人。谢谢你让我知道-我正在研究更好的实现,如果其他人不抢先一步,我会更新我的答案!我应该补充一点,
execute
只适用于不需要大量交互的命令。这在大多数情况下也是不正确的,或者至少是过度使用。也不要直接使用类,使用shell_out方法包装器来获得一些常见的Chef-y行为。最后我使用了
cwdlazy{Dir['/tmp/unixODBC.*'].sort_by{f | File.mtime(f)}.last+'/unixODBC-2.3.0'}
。谢谢