我想使用shell脚本输出来验证处于保护状态的资源。我使用下面的代码仍然无法正常工作。
bash "stampDisksuccess" do
code <<-EOH
whoami
EOH
user 'root'
not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
end
脚本(getStampedDisk.sh)是否返回空白消息或某些数据,bash资源正在执行。我希望它在脚本返回空白数据时不应该运行。
如果有任何遗漏,请纠正我。
答案 0 :(得分:12)
让我们剖析它:
not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
{
阻止开放"
字符串打开==
运营商''
常量空字符串}
关闭块这是很多操作来测试你有一个空字符串。反引号的输出不保证真的是空的(例如它可以有换行符)然后你将它与任意空字符串(不是nil,它是一个没有任何内容的字符串)进行比较。有很多方法可以变坏,调试非打印字符非常困难。
然而,shell已经有了这个操作符,对于通常的bash来说它是-z
。
引用bash文档:
-z string True if the length of string is zero.
另一个助手是$()
来评估脚本中的命令
最后一个[[ ]]
构造告诉我们使用的是操作符而不是命令。
当表达为字符串(Documentation on guards here)
时,你最终会得到命令执行保护not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]'
来自警卫文件的引用:
guard属性接受字符串值或Ruby块值:
- 字符串作为shell命令执行。如果命令返回0,则 守卫是适用的。如果该命令返回任何其他值,那么 保护属性未应用。
- 一个块作为Ruby代码执行 必须返回true或false。如果该块返回true,则保护 属性已应用。如果块返回false,则为guard属性 不适用。
如果你没有在守卫中使用红宝石,不要使用一个块,你只是添加图层会让你遇到麻烦,特别是当你试图比较不可打印或空字符串并且它更难调试,如果需要调用命令或脚本,请尝试坚持使用标准shell命令,您可以在控制台中测试它,并确保以后不会出现问题。