Por que algumas ferramentas do Linux escrevem para STDERR em vez de STDOUT por padrão?

5

Por que alguns programas utilitários Linux enviam a saída para operação "normal" para STDERR em vez de STDOUT?

Por exemplo, quando eu executo o seguinte comando (no CentOS 7.3):

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

Eu vejo a saída no TTY mesmo que o status de saída seja zero e não haja erros.

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

Eu notei um punhado de outros programas que fazem isso também. Imaginando se há alguma boa explicação.

Para referência, eu preciso chamar esta linha em um script post de RPM% e eu gostaria de redirecionar a saída "normal" para /dev/null e capturar somente as mensagens do tipo "erro" verdadeiro. Esse comando específico não oferece uma opção -q quiet .

    
por Mark Edington 23.01.2017 / 17:14

1 resposta

5

grub2-mkconfig normalmente grava o arquivo de configuração gerado para stdout para que você possa redirecioná-lo convenientemente. Informação de status é escrito para stderr porque interferiria com o saída redirecionada. Quando você usa o argumento -o em vez disso, o Este último comportamento permanece o mesmo, que deve por causa de consistência:

# 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}
    
por 23.01.2017 / 17:38