Como Guido aponta acima, o nohup já redireciona o erro padrão para você, a menos que você o redirecione para um arquivo. Se você estiver usando Linux, pode ser instrutivo executar um comando simples em nohup e examinar as chamadas para dup2(2)
imediatamente antes de execve(2)
.
Eu duvido que você esteja vendo o que pensa que está vendo. Vamos pensar sobre o que acontece quando você diz
nohup foo 2>&1
- O shell redireciona stderr para stdout.
- Em seguida, ele invoca nohup , que herda essa situação (stderr e stdout usando o mesmo descritor de arquivo).
-
nohup abre
nohup.out
(descritor de arquivo 3), dups dele para o descritor de arquivo 1 e fecha 3. -
nohup avisos stderr não é arquivo, e dups arquivo descritor 1 a 2, também. Assim, os descritores de arquivo 1 e 2 referem-se a
nohup.out
. -
nohup chama
exec
com quaisquer argumentos fornecidos na linha de comando (neste caso, foo ). O novo processo herda os descritores de arquivo que nohup configuram para ele.
Na linha de comando você não pode criar um caso no qual, como você diz, nohup apenas redireciona stderr-outputs . nohup sempre grava stdout e stderr em um arquivo. stdout vai para um que você especificar via redirecionamento, ou para nohup.out
; stderr segue stdout a menos que você redirecione explicitamente para outro arquivo.
O aspecto peculiar de usar 2>&1
com nohup é que a versão do GNU produz uma mensagem sem sentido no stderr, nohup: ignorando entrada e adicionando saída a 'nohup.out' . (Que outro utilitário grava uma mensagem para erro padrão que equivale a dizer, agindo por documentação em instruções ?) Normalmente esse ruído é gravado no terminal; sob redirecionamento, ele acaba sendo a primeira linha do arquivo de saída.