Até onde eu sei, parte da saída gerada pelo comando /usr/bin/modulecmd
não vai para stdout nem stderr, conforme ilustrado pelo exemplo a seguir:
% /usr/bin/modulecmd bash help null >/dev/null 2>&1
This module does absolutely nothing.
It's meant simply as a place holder in your
dot file initialization.
Version 3.2.9
Existe alguma maneira de invocar um comando (como /usr/bin/modulecmd) para que toda a sua saída vá para stdout ou stderr? Como alternativa, existe alguma maneira de o código que invoca /usr/bin/modulecmd
capturar toda a saída que normalmente enviaria para o terminal?
Depende do que o programa faz. Além da saída padrão (fd 1) e do erro (fd 2), a entrada padrão (fd 0) geralmente também é aberta como leitura/gravação quando um programa é iniciado a partir do terminal sem redirecionamentos e pode ser usado para escrever a saída. Outra opção é abrir explicitamente
/dev/tty
, o que dá um novo fd conectado ao terminal de controle do processo.modulecmd
usa stdin, por algum motivo. Executandostrace
nele, vemos que ele grava a linha de cabeçalho no fd 2 original, então (após alguns malabarismos fd não relacionados que não toca em fd 0) duplica fd 0 (stdin) para fd 2 e imprime a descrição lá.Então você pode redirecionar essa parte da mensagem redirecionando stdin (fd 0) para algum arquivo, por exemplo
0>somefile
(ou/dev/null
para suprimi-lo), além de qualquer redirecionamento de stdout e stderr.Um redirecionamento como
< /dev/tty
também pode impedir a saída dando ao processo um fd explicitamente somente leitura. (No entanto, o programa receberia um erro para awrite()
chamada.) No Linux, você pode até fazer< /dev/stdin
o mesmo resultado, se o stdin original estiver conectado a um terminal.Se algum programa usado
/dev/tty
, capturar a saída é mais difícil. Se disponível, algo comosetsid
poderia ser usado para iniciar o programa sem um terminal de controle, o que significaria que a abertura/dev/tty
falharia. (Bem, isso é o que ele faz no Linux de qualquer maneira.)Acho que a resposta para a pergunta é " Não " pelo seguinte motivo: Você só pode redirecionar a saída que existia antes do início do comando. Ou seja: Se o comando abrir uma nova saída, você não poderá impedi-lo redirecionando.