在单行中使用 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 -exec
或xargs
调用它。这两个程序都只能执行实际程序。
【讨论】:
【参考方案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 用于失败