为什么有些 Linux 工具默认写入 STDERR 而不是 STDOUT?

为什么有些 Linux 工具默认写入 STDERR 而不是 STDOUT?

为什么某些 Linux 实用程序将“正常”操作的输出发送到 STDERR 而不是 STDOUT?

例如,当我运行以下命令时(在 CentOS 7.3 中):

/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg 1> /dev/null ; echo $?

即使退出状态为零且没有错误,我也能在 TTY 上看到输出。

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-1ef39414718640fe9f6ec0f6d65fdc3e
Found initrd image: /boot/initramfs-0-rescue-1ef39414718640fe9f6ec0f6d65fdc3e.img
done
0

我注意到一些其他程序也可以执行此操作。想知道是否有一些好的解释。

作为参考,我需要在 RPM %post 脚本中调用此行,并且我想将“正常”输出重定向到/dev/null并仅捕获真正的“错误”类型消息。此特定命令不提供-q quiet开关。

答案1

grub2-mkconfig通常将生成的配置文件写入 标准输出这样您就可以方便地重定向它。状态信息写入标准错误因为它会干扰重定向的输出。当您改用该-o参数时,后一种行为保持不变,为了保持一致性,它应该保持不变:

# grub2-mkconfig >/tmp/grub.conf.a
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-4.8.15-200.fc22.x86_64
Found initrd image: /boot/initramfs-4.8.15-200.fc22.x86_64.img
Found linux image: /boot/vmlinuz-4.4.14-200.fc22.x86_64
Found initrd image: /boot/initramfs-4.4.14-200.fc22.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b764638bab7b90d16d0510c14a429d80
Found initrd image: /boot/initramfs-0-rescue-b764638bab7b90d16d0510c14a429d80.img
Found Fedora release 22 (Twenty Two) on /dev/sda2
done
# grub2-mkconfig -o /tmp/grub.conf.b
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-4.8.15-200.fc22.x86_64
Found initrd image: /boot/initramfs-4.8.15-200.fc22.x86_64.img
Found linux image: /boot/vmlinuz-4.4.14-200.fc22.x86_64
Found initrd image: /boot/initramfs-4.4.14-200.fc22.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b764638bab7b90d16d0510c14a429d80
Found initrd image: /boot/initramfs-0-rescue-b764638bab7b90d16d0510c14a429d80.img
Found Fedora release 22 (Twenty Two) on /dev/sda2
done
# diff -u /tmp/grub.conf.{a,b}

相关内容