我正在尝试使用下面的代码片段在我的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目录中查找服务名称时。但是,并非所有服务都是如此。 现在,我该如何抑制此控制台输出?我不想在控制台上看到这个。有什么指针吗?
答案 0 :(得分:1)
您可以将整个事物包装在括号中并执行2>/dev/null
(
...
script
...
) 2>/dev/null
- 这将在子shell中运行脚本/片段。
有关重定向的详细信息,请参阅this page。
答案 1 :(得分:1)
要取消stdout
和stderr
,您只需将输出重定向为: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
这更优雅,因为你可以执行脚本而无需最后一次重定向调试或类似的东西,至少在我看来。