Bash - 如何在不打印的情况下检查命令是否没有输出?

时间:2017-03-28 20:51:27

标签: bash

我正在编写一个测试脚本。它使用作为输入传递的* .in文件执行程序,并使用 diff 命令将其输出与* .out文件进行比较。

但是,我不想打印 diff 输出,但要检查是否有,如果是,请将* .in文件名添加到失败测试列表中。< / p>

问题是我不知道如何检查命令是否产生输出而不打印它。

我的脚本现在:

failed_tests=""

for filename in $directory/*.in; do

    command=< ${filename} ./${program} | diff - ${filename%.in}.out

    # Check if command produces output.
    if command; then
        # Add filename to failed tests list.
        failed_tests="${failed_tests} ${filename}"
    fi

done

echo $failed_tests

提前感谢您的所有答案。

4 个答案:

答案 0 :(得分:1)

如果没有差异,

diff的退出状态为0,否则为非零。您可以使用-q选项来取消大部分输出,并将其余部分重定向到/dev/null。然后,if语句可以直接测试退出状态。

# Also, use an array to store a list of filenames
failed_tests=()
for filename in "$directory"/*.in; do
    if ./"$program" "$filename" | diff -q - "${filename%.in}.out" > /dev/null; then
        failed_tests+=( "$filename" )
    fi
done

答案 1 :(得分:1)

你的方法是可行的,但是你必须在``或$()中捕获$命令,同时,$ filename应该作为输入但不重定向其内容。在旁注中,您可能想要删除变量中的花括号,只要相邻的字符不是分隔符,它就应该工作。 _

command=$(./$program $filename | diff - -q $filename%.in.out)
diff中的

-q选项表示仅在.out不同时报告。不带方括号的if仅适用于具有退出状态的程序或命令。例如grep

if [[ -n $command ]]; then
    # Add filename to failed tests list.
    failed_tests="$failed_tests $filename"
fi

-n选项表示不为空

最后,循环之外的相同方法:

if [[ -n $failed_tests ]]; then
    #do something here
fi

答案 2 :(得分:0)

您可以使用

diff -q的输出做出反应
if [ -n "$(diff -q file1 file2)" ]; then 
   echo different
fi

您想比较您的编程的输出,这可能与流程替换:

if [ -n "$(diff -q $(command "${filename}") file2)" ]; then 
   echo different
fi

答案 3 :(得分:-1)

要从命令获取输出,您可以使用variable=$`command`

int age;
cin >> age;

然后你可以对变量内容使用一些简单的条件。