Ao ler sobre Linux, recebi o seguinte:
Como stderr não é igual a stdout, mensagens de erro ainda serão vistas nas janelas do terminal no exemplo acima.
Se você deseja redirecionar o stderr para um arquivo separado, use o número do descritor de arquivo do stderr (2), o sinal de maior que (>), seguido pelo nome do arquivo que deseja armazenar tudo o que o comando em execução grava no stderr:
$ do_something 2> error-file
Uma notação abreviada especial pode ser usada para colocar qualquer coisa escrita no descritor de arquivo 2 (stderr) no mesmo lugar que o descritor de arquivo 1 (stdout): 2>&1
$ do_something > all-output-file 2>&1
bash permite uma sintaxe mais fácil para o acima:
$ do_something >& all-output-file
Aqui do_something
está algum comando. Eu realmente não estou entendendo o que está acontecendo em todos os três comandos mencionados acima. Eu sei &
que é usado para transformar um processo em segundo plano, mas não estou entendendo a lógica. Sou novo neste sabor, por favor. Alguém pode explicar isso?
Responder1
Sua confusão pode ser porque >&
é algo totalmente diferente de &
.
>&
ou <&
são usados no redirecionamento para apontar para um descritor de arquivo (fd). Os casos acima redirecionam para 1 e 2, que são stdout e stderr respectivamente.
>
significa "redirecionar stdout"
2>
significa "redirecionar fd 2 (stderr)"
>&2
significa "redirecionar stdout para fd 2 (stderr)". Observe como isso difere do >2
que significaria "redirecionar stdout para um arquivo chamado 2
" - é por isso que &
é importante. Indica que o próximo passo será um fd, não um nome de arquivo.
Agora, é claro, como você observou, se a &
estiver sozinho, sem um símbolo de redirecionamento, isso significa algo completamente diferente - "retorne imediatamente, execute o comando anterior em segundo plano".