抑制控制台输出的错误,同时运行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。
要压制stdout
和stderr
,您只需重定向输出:。
第一次重定向>/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
这更加优雅,因为你可以在没有最后重定向的情况下执行脚本来调试或者像这样,至少在我看来。