【问题标题】:Suppressing console output an errors while running Shell Script运行 Shell 脚本时抑制控制台输出错误
【发布时间】:2014-11-21 19:34:00
【问题描述】:

我正在尝试使用以下代码 sn-p 在我的 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 目录中查找服务名称的时候。但是,并非所有服务都如此。 现在,我怎样才能抑制这个控制台输出?我不想在控制台上看到这个。有什么指点吗?

【问题讨论】:

    标签: shell package rpm


    【解决方案1】:

    你可以把整个东西包在括号里,然后做一个2>/dev/null

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

    -这将在子shell中运行脚本/sn-p。

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

    【讨论】:

      【解决方案2】:

      要抑制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 这更优雅,因为你可以执行脚本而无需最后重定向到调试或至少在我看来是这样的。

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 1970-01-01
        • 2021-02-20
        • 2016-03-29
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多