抑制控制台输出的错误,同时运行Shell脚本

问题描述:

我想所有正在运行的服务的输出列表,使用下面的代码片段在我的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目录查找服务名称。但是,这不适用于所有服务。 现在,我该如何抑制这个控制台输出?我不想在控制台上看到这个。任何指针?

你可以包装在括号中的整个事情,做一个2>/dev/null

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

- 那将运行在一个子shell脚本/片段。

有关重定向的更多信息,请参阅this page

要压制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这更加优雅,因为你可以在没有最后重定向的情况下执行脚本来调试或者像这样,至少在我看来。