如何在bash中将错误重定向到/ dev / null?

时间:2015-08-09 07:01:43

标签: bash

我们每天运行Selenium测试来测试我们的网站和扩展。我编写了一个脚本(根据this question)来计算传递和失败测试的数量。这是脚本:

#!/bin/bash

today=`TZ='Asia/Tel_Aviv' date +"%Y-%m-%d"`
yesterday=`TZ='Asia/Tel_Aviv' date +"%Y-%m-%d" -d "yesterday"`

...

print_test_results()
{
    declare -i passed_tests=0
    declare -i failed_tests=0
    declare -i total_tests=0
    log_suffix="_${file_name}.log"
    yesterday_logs="${log_prefix}${yesterday}_[1,2]*${log_suffix}"
    today_logs="${log_prefix}${today}_0*${log_suffix}"
    for temp_file_name in $yesterday_logs $today_logs ; do
        total_tests+=1
        if grep -q FAILED "$temp_file_name" ; then
            failed_tests+=1
        elif grep -q OK "$temp_file_name" ; then
            passed_tests+=1
        else
            failed_tests+=1
        fi
    done
    echo "<tr>"
    echo "<td>$test_name - $today</td>"
    if [ $passed_tests = "0" ]; then
        echo "<td>$passed_tests passed</td>"
        echo "<td><span style=\"color: red;\">$failed_tests failed</span></td>"
    else
        echo "<td><span style=\"color: green;\">$passed_tests passed</span></td>"
        echo "<td>$failed_tests failed</td>"
    fi
    echo "<td>$total_tests tests total</td>"
    echo "</tr>"
}

file_name="chrome_gmail_1_with_extension_test"
test_name="Chrome Gmail 1 With Extension Test"
print_test_results

...

但问题是,如果文件不存在(in $yesterday_logs $today_logs),我会收到错误消息。如何将这些错误消息重定向到/ dev / null?我想将它们从脚本重定向到/ dev / null,而不是从调用脚本的行重定向 - 我希望这个脚本永远不会显示有关不存在的文件的错误消息。

3 个答案:

答案 0 :(得分:5)

仅供记录:

通常,要禁止bash中的错误消息,请使用command 2>/dev/null。因此,在您的情况下,您应该使用grep -q OK 2>/dev/null

但是,正如您的案例也显示(从我在评论中看到的内容),这是一件冒险的事情,因为它会掩盖您在代码中可能出现的错误。 &#34;我希望这个脚本永远不会打印错误消息&#34;只有在知道可能发生的所有可能的错误情况时才应该说。

答案 1 :(得分:3)

在您的脚本中,您可以将此行放在开头:

shopt -s nullglob

如果您的glob模式找不到任何匹配的文件,那么这将无法匹配任何内容。否则,当您使用以下内容时会返回整个glob模式:

for temp_file_name in $yesterday_logs $today_logs; do ... done

答案 2 :(得分:0)

最终我将此行更改为:

for temp_file_name in `ls $yesterday_logs $today_logs 2>/dev/null` ; do
    total_tests+=1
    if grep -q FAILED "$temp_file_name" ; then
        failed_tests+=1
    elif grep -q OK "$temp_file_name" ; then
        passed_tests+=1
    else
        failed_tests+=1
    fi
done

然后只有ls错误被定向到/dev/null