如何在not_if条件下使用shell脚本

SAS*_*ASI 3 bash recipe chef-infra

我想使用shell脚本输出来验证保护条件下的资源.我使用下面的代码仍然无法正常工作.

bash "stampDisksuccess" do
                code <<-EOH
                whoami
        EOH
        user 'root'
        not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
      end
Run Code Online (Sandbox Code Playgroud)

无论脚本(getStampedDisk.sh)返回空白消息还是某些数据,bash资源都会被执行.我期待它在脚本返回空白数据时不应该运行.

如果有任何遗漏,请纠正我.

Ten*_*bai 12

让我们剖析一下:

not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
Run Code Online (Sandbox Code Playgroud)
  • Not_if ......非常明显,这是警卫
  • { 阻止开放
  • "串开
  • 反击开场
  • 命令
  • 关闭反叛和引用
  • == 操作者
  • '' 恒定的空字符串
  • } 关闭块

这是测试你有一个空字符串的很多操作.反引号的输出不保证真的是空的(例如它可以有换行符)然后你将它与任意空字符串(不是nil,它是一个没有任何内容的字符串)进行比较.有很多方法可以变坏,调试非打印字符非常困难.

然而,贝壳已经是一个操作员,这-z是通常的bash.

引用bash文档:

-z string
    True if the length of string is zero.
Run Code Online (Sandbox Code Playgroud)

另一个帮助是$()评估脚本内的命令

最后一个[[ ]]结构告诉我们使用的是操作员而不是命令.

当表达为字符串时,你最终会得到命令执行保护(这里有关于守卫的文档)

not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]' 
Run Code Online (Sandbox Code Playgroud)

从警卫文件中引用:

guard属性接受字符串值或Ruby块值:

  • 字符串作为shell命令执行.如果命令返回0,则应用保护.如果该命令返回任何其他值,则不应用guard属性.
  • 块作为Ruby代码执行,必须返回true或false.如果块返回true,则应用guard属性.如果块返回false,则不应用guard属性.

如果你不在守卫中使用红宝石,不要使用块,你只是添加图层会让你遇到麻烦,特别是当你试图比较不可打印或空字符串并且它更难调试时,试着如果您需要调用命令或脚本,请坚持使用标准shell命令,您可以在控制台中测试它,并确保以后不会出现问题.