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

时间:2016-09-03 13:13:54

标签: bash

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

有些事情:

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
到目前为止,我并没有得到太多的爱。建议?

3 个答案:

答案 0 :(得分: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调用它。这两个程序都只能执行实际的程序。

答案 1 :(得分:0)

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

Is there a TRY CATCH command in Bash

使用||&&,您可以替换try-catch种行为

答案 2 :(得分:0)

尝试使用“-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" \;