2014-11-21 91 views
1

我想所有正在運行的服務的輸出列表,使用下面的代碼片段在我的Linux版本(CentOS)框對應的包和狀態: -抑制控制檯輸出的錯誤,同時運行Shell腳本

for i in $(service --status-all | grep -v "not running" | grep -E running\|stopped | awk '{print $1}'); do 
packagename=$(rpm -qf /etc/init.d/$i) 
servicestatus=$(service --status-all | grep $i | awk '{print $NF}'); 
echo $tdydate, $(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'), $i, $packagename, $servicestatus >> "$HOME/MyLog/running_services.csv" 
done 

然而,當我運行該腳本,我得到的控制檯這樣的錯誤: -

error: file /etc/init.d/cupsd: No such file or directory 
error: file /etc/init.d/hald: No such file or directory 
error: file /etc/init.d/lvmetad: No such file or directory 
error: file /etc/init.d/postmaster: No such file or directory 

也許,這是當它試圖在/etc/init.d目錄查找服務名稱。但是,這不適用於所有服務。 現在,我該如何抑制這個控制檯輸出?我不想在控制檯上看到這個。任何指針?

回答

1

你可以包裝在括號中的整個事情,做一個2>/dev/null

(
... 
script 
... 
) 2>/dev/null 

- 那將運行在一個子shell腳本/片段。

有關重定向的更多信息,請參閱this page

1

要壓制stdoutstderr,您只需重定向輸出:​​。

第一次重定向>/dev/null會將標準輸出重定向到/dev/null,這會抑制它。此標準輸出是通過命令寫入屏幕的內容,而不是錯誤(例如,在執行echo "hello"時,hello將是stdout的一行)。

第二次重定向2>&1會將stderr或標準錯誤耦合到與標準輸出相同的位置(因此還會對/dev/null)。

關於符號的說明:在linux中有三個標準文件描述符(雖然我認爲你可以創建更多,不確定)。 1類似於標準輸出,2個標準錯誤和0個標準輸入。因此,您也可以將標準錯誤(即錯誤消息)重定向到日誌文件,如下所示:2>/path/to/log/file.log

Google for file descriptor for more information。

所以,你可以像pacman--建議包裝整個代碼並重定向輸出一樣,但你也可以這樣調用你的腳本:bash script.sh >/dev/null 2>&1這更加優雅,因爲你可以在沒有最後重定向的情況下執行腳本來調試或者像這樣,至少在我看來。

相關問題