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

Bash 如何在not_if条件下使用shell脚本,bash,chef-infra,recipe,Bash,Chef Infra,Recipe,我想使用shell脚本输出来验证处于保护状态的资源。我正在使用下面的代码,但它仍然不起作用 bash "stampDisksuccess" do code <<-EOH whoami EOH user 'root' not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''} end bash“

我想使用shell脚本输出来验证处于保护状态的资源。我正在使用下面的代码,但它仍然不起作用

bash "stampDisksuccess" do
                code <<-EOH
                whoami
        EOH
        user 'root'
        not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
      end
bash“stampdisksucces”do
代码让我们仔细分析一下:

not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
  • 如果。。。很明显,是警卫
  • {
    块打开
  • 字符串打开
  • 背钩开口
  • 命令
  • 结束回执和报价
  • ==
    运算符
  • ''
    常量空字符串
  • }
    关闭块
要测试空字符串,需要进行大量操作。backticks的输出不能保证为真空(例如,它可以有一个换行符),然后将其与任意空字符串进行比较(不是nil,它是一个空字符串).有很多方法会使它变糟,而且调试非打印字符非常困难

但是shell已经有了一个操作符,对于通常的bash,它是
-z

引用bash文档:

另一个助手是
$()
,用于评估脚本中的命令

最后一个是
[[]]
构造,它告诉我们使用的是运算符而不是命令

当以字符串()表示时,所有这些都会导致命令执行保护

引用guard文档:

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

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

如果你不在保护中使用ruby,不要使用块,你只是在添加层,这会给你带来麻烦,特别是当你试图比较不可打印的或空的字符串,并且调试比较困难时,如果你需要调用命令或脚本,试着使用标准的shell命令,你可以在控制台中测试它并确保它不是pr稍后有问题。

结果是什么?编辑了我的问题..请检查..我无法理解chef是如何在内部工作的..即使我在'[-z sudo sh/home/scripts/getStampedDisk.sh test]]中使用了not_]'我的资源正在被执行,防护装置不工作。shell脚本的输出为空。它真的是0长度吗?如果不知道.sh文件的内部,很难判断。@SASI和您忘记了
$()
给出
-z
命令的输出,而不是命令本身的文本。我也编辑了我的答案来更正这一点。谢谢Tensibai..你能告诉我如何用not_if'[-z$(sudo sh/home/scripts/getStampedDisk.sh#{node[:test][:value]})这样的属性替换“test”吗“@SASI只需将单引号
替换为双引号
,ruby插值就可以了。(如果你的问题能解决你的问题,考虑接受答案)
-z string
    True if the length of string is zero.
not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]'