Você perdeu o ponto mais importante, o redirecionamento de shell é aplicado da esquerda para a direita.
Em:
{ 2>&3 "$@"& } 3>&2 2>/dev/null
O comando do grupo inteiro é executado com:
- Descritor de arquivo 3 = > erro padrão, que é terminal neste momento.
- Descritor de arquivo 2 (erro padrão) = > / dev / null
Assim, quando o comando dentro do agrupamento é executado:
- Erro padrão = > Descritor de arquivo 3, que é apontado para o terminal.
Portanto, se "$@"&
imprimir qualquer coisa em seu erro padrão, a saída será impressa no terminal.
Para seus casos concretos:
{ grep warning system.log& } 2>/dev/null
{ grep warning system.log& }
executado com erro padrão é apontado para /dev/null
. grep
não substitui nenhum redirecionamento, portanto, seu erro padrão é o mesmo com {...}
e é redirecionado para /dev/null
, você não obteve saída para o terminal.
Em:
{ 2>&3 grep warning system.log& } 3>&2 2>/dev/null
O erro padrão de grep
é redirecionado para o descritor de arquivo 3, que é apontado para o terminal como explicado acima, então você tem saída para o terminal.