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

时间:2014-11-21 05:20:12

标签: shell package rpm

我正在尝试使用下面的代码片段在我的Linux(Centos)框中输出所有正在运行的服务列表,相应的包和状态: -

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

可能是在尝试在init.d目录中查找服务名称时。但是,并非所有服务都是如此。 现在,我该如何抑制此控制台输出?我不想在控制台上看到这个。有什么指针吗?

2 个答案:

答案 0 :(得分:1)

您可以将整个事物包装在括号中并执行2>/dev/null

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

- 这将在子shell中运行脚本/片段。

有关重定向的详细信息,请参阅this page

答案 1 :(得分:1)

要取消stdoutstderr,您只需将输出重定向为:command >/dev/null 2>&1

第一次重定向>/dev/null会将标准输出重定向到/dev/null,这会抑制它。此标准输出是通过命令写入屏幕的内容,而不是错误(例如,在执行echo "hello"时,hello将是stdout行。

第二次重定向2>&1会将stderr或标准错误耦合到与标准输出相同的位置(也是/dev/null)。

关于符号的注释:linux中有三个标准文件描述符(虽然我认为你可以创建更多,但不确定)。 1类似于标准输出,2个标准误差和0个标准输入。因此,您还可以将标准错误(即错误消息)重定向到日志文件,如下所示:2>/path/to/log/file.log

Google提供了文件描述符以获取更多信息。

所以你可以像pacman一样建议包装整个代码并重定向输出,但你也可以这样调用你的脚本:bash script.sh >/dev/null 2>&1这更优雅,因为你可以执行脚本而无需最后一次重定向调试或类似的东西,至少在我看来。