2015-08-09 16 views
1

我們每天運行Selenium測試來測試我們的網站和擴展。我寫了一個腳本(根據this question)來計算通過和失敗測試的次數。下面是該腳本:如何將錯誤重定向到bash中的/ dev/null?

#!/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,而不是從調用腳本的行中 - 我希望此腳本不會顯示有關不存在的文件的錯誤消息。

+0

[使用cat命令時抑制錯誤消息]的可能重複(https://stackoverflow.com/questions/27178935/suppress-error-message-while-using-cat-command) – Sam

回答

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

+1

該解決方案有幾個問題。 ①'$ yesterday_logs'等空格會讓你陷入麻煩。即使當前的實現沒有空格,也可以使用雙引號來避免這種情況。事情隨着時間而改變。 ②使用'ls'列出所有目錄條目也有類似的問題,例如, G。如果任何條目包含空格或換行符等。 ③不推薦使用反引號進行命令輸出捕獲。你現在應該用'$(...)'代替。 – Alfe

3

內,您的腳本,你可以在開始放置這一行:

shopt -s nullglob 

,如果你的glob模式未找到任何匹配的文件這將不匹配任何東西。

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

是的,它的工作原理。我接受這個答案。我在date -d命令中輸入了一個錯字,這就是我收到錯誤信息的原因。 – Uri

4

只是爲了記錄:否則,當你使用類似返回整個glob模式

一般情況下,抑制bash的錯誤,使用command 2>/dev/null。所以在你的情況下,你應該使用​​。

但正如你的情況也顯示(從我在評論中讀到的內容),這是一件有風險的事情,因爲它掩蓋了你在代碼中可能存在的錯誤。 「我希望這個腳本永遠不會打印錯誤信息」只能在知道全部可能發生的可能的錯誤情況時才被說出。

+0

Hi @Alfe,'grep -q OK'是不夠的,因爲我grep每個文件兩次。如何在$ yesterday_logs $ today_logs中爲'temp_file_name命令添加'2>/dev/null';做...'? – Uri

+0

當然,重定向只適用於它所應用的命令,因此您必須在每個命令('grep')上重複開始的短語。把它應用到一個範圍,像這樣追加它:'for i in ...;做...;完成2>/dev/null',i。即在結束時,在結束「完成」之後;那麼該範圍內的所有命令都將受到影響。 – Alfe

+0

謝謝,我接受這個答案,因爲這就是我的意思,我只是不知道把'2>/dev/null'放在哪裏。 – Uri

相關問題