在单行中使用 bash 测试失败的命令

Posted

技术标签:

【中文标题】在单行中使用 bash 测试失败的命令【英文标题】:Test for failed commands using bash in one-liner 【发布时间】:2017-01-11 10:48:24 【问题描述】:

我想输出命令成功的文件的名称,当我预计它会失败时,同时抑制警告。我更喜欢单线。

类似的东西:

find xml/malformed-xml -type f -iname '*.xml' -exec if xmllint --noout --dtdvalid check-xml.dtd  2>/dev/null; then echo "Should have failed for "; fi \;

find xml/malformed-xml -type f -iname '*.xml' -print0 | xargs -0 -n 1 -i if xmllint --noout --dtdvalid check-xml.dtd  2>/dev/null ; then echo "Should have failed for "; fi

到目前为止,我还没有得到太多的爱。有什么建议吗?

【问题讨论】:

bash 有抛弃亲人的习惯 ;) 前提是你玩得不公平 【参考方案1】:

试试这个:

find xml/malformed-xml -type f -iname '*.xml' -exec xmllint --noout --dtdvalid check-xml.dtd   \; -print 2>/dev/null

解释:在find 中,参数由-and 隐式分隔。所以-exec ... \; -print 真的是-exec ... \; -print。现在因为-and的短路逻辑,第二部分只有在第一部分成功的情况下才会执行。

你的两个建议都失败的原因是if ... then ... else ... 不是一个程序,它是一个内置的bash,所以你不能从find -execxargs 调用它。这两个程序都只能执行实际程序。

【讨论】:

【参考方案2】:

我认为这可能会对您有所帮助:

Is there a TRY CATCH command in Bash

使用 ||&& 您可以替换为 try-catch 类型的行为

【讨论】:

【参考方案3】:

尝试使用“-exec sh -c ...”调用子shell

find xml/malformed-xml -type f -iname '*.xml' -exec sh -c "if xmllint --noout --dtdvalid check-xml.dtd  2>/dev/null; then echo Should have failed for ; fi" \;

【讨论】:

以上是关于在单行中使用 bash 测试失败的命令的主要内容,如果未能解决你的问题,请参考以下文章

如果 bash 命令的状态在某个范围内,则 Oneliner 用于失败

bash 基础

shell编程之条件测试

渗透测试工具懒人的福音,渗透测试单行化工具

linux命令中bash常用的条件测试:整数测试eq,文件测试-e,字符串测试==

bash shell中测试命令