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)
{ 阻止开放"串开== 操作者'' 恒定的空字符串} 关闭块这是测试你有一个空字符串的很多操作.反引号的输出不保证真的是空的(例如它可以有换行符)然后你将它与任意空字符串(不是nil,它是一个没有任何内容的字符串)进行比较.有很多方法可以变坏,调试非打印字符非常困难.
然而,贝壳已经是一个操作员,这-z是通常的bash.
引用bash文档:
Run Code Online (Sandbox Code Playgroud)-z string True if the length of string is zero.
另一个帮助是$()评估脚本内的命令
最后一个[[ ]]结构告诉我们使用的是操作员而不是命令.
当表达为字符串时,你最终会得到命令执行保护(这里有关于守卫的文档)
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命令,您可以在控制台中测试它,并确保以后不会出现问题.