Io-Redirection

為什麼有些 linux 工具預設寫入 STDERR 而不是 STDOUT?

  • January 23, 2017

為什麼某些 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開關。

grub2-mkconfig通常將生成的配置文件寫入 標準輸出,以便您可以方便地重定向它。狀態資訊被寫入stderr,因為它會干擾重定向的輸出。當您-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}

引用自:https://unix.stackexchange.com/questions/339565