使用一行Bash命令进行失败命令测试的测试
使用一行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
但是到目前为止,我并没有得到太多帮助。有什么建议吗?
在Bash中,我们经常会遇到一些命令执行失败的情况。这时,我们需要找到出现问题的原因,并寻找解决方法。
通过阅读上述链接中的内容,我们可以了解到在Bash中可以使用||
和&&
来模拟try-catch
的行为。
那么为什么会出现命令执行失败的情况呢?有以下几个可能的原因:
1. 命令本身的错误:有时候命令本身可能存在错误,导致执行失败。这可能是由于语法错误、参数错误或者其他一些问题引起的。这时候我们需要检查命令的语法和参数,确保其正确性。
2. 环境问题:有时候命令执行失败是由于环境问题引起的。这可能是由于缺少依赖项、权限问题或者其他一些环境配置问题导致的。这时候我们需要检查环境配置,确保其满足命令的要求。
3. 外部因素:有时候命令执行失败是由于外部因素引起的。这可能是由于网络问题、服务器问题或者其他一些外部因素引起的。这时候我们需要检查网络连接和服务器状态,确保其正常工作。
那么如何解决这些问题呢?通过使用||
和&&
,我们可以在命令执行失败时执行一些备选操作,从而实现一种类似于try-catch
的行为。
具体来说,当我们希望在命令执行成功时执行某个命令时,我们可以使用&&
运算符。例如,command1 && command2
,表示当command1
执行成功时,才会执行command2
。
而当我们希望在命令执行失败时执行某个命令时,我们可以使用||
运算符。例如,command1 || command2
,表示当command1
执行失败时,才会执行command2
。
通过使用这些运算符,我们可以根据命令执行的结果来采取不同的操作,从而实现对命令执行失败的处理。
通过使用||
和&&
运算符,我们可以在Bash中模拟try-catch
的行为,从而解决命令执行失败的问题。我们可以根据命令执行的结果来采取不同的操作,从而应对不同的情况。这是一种简单而有效的处理方式,可以帮助我们更好地处理命令执行失败的情况。
问题出现的原因是因为在`find`命令中,参数是隐式地由`-and`分隔的。所以`-exec ... {} \; -print`实际上是`-exec ... {} \; -print`。由于`-and`的短路逻辑,只有当第一个部分成功时,第二个部分才会被执行。
你的两个建议都失败的原因是`if ... then ... else ...`不是一个程序,它是一个bash内置命令,所以你不能从`find -exec`或`xargs`中调用它。这两个程序只能执行实际的程序。
解决方法是将`if ... then ... else ...`的逻辑转换为可以在命令行中执行的命令。这可以通过使用管道(`|`)和其他命令来实现。在这种情况下,可以使用`grep`和`awk`来模拟`if ... then ... else ...`的逻辑。
下面是修改后的命令,可以在一行中测试失败的命令:
find xml/malformed-xml -type f -iname '*.xml' -exec xmllint --noout --dtdvalid check-xml.dtd {} \; 2>/dev/null | grep "validates" | awk '{print $1}'
这个命令的作用是在`xml/malformed-xml`目录下查找所有扩展名为`.xml`的文件,并使用`xmllint`命令对每个文件进行验证。然后,将验证通过的文件的路径传递给`grep`命令,过滤出包含"validates"的行。最后,使用`awk`命令提取出第一列,即文件的路径。
通过这种方式,可以在一行中测试失败的命令,并将结果输出为文件的路径。
问题的原因:
在执行上述命令时,可能会出现失败的情况。失败的原因可能是由于某些XML文件格式不正确,导致无法使用xmllint命令进行验证。这可能会导致脚本无法正确处理这些文件,从而出现错误。
解决方法:
为了解决这个问题,可以尝试调用一个子shell来执行命令。通过在-exec参数后面添加"sh -c",可以创建一个子shell,并在子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" \;