`Estou lendo uma resposta para https://stackoverflow.com/questions/692000/how-do-i-write-standard-error-to-a-file-while-using-tee-with-a-pipe/692009#692009 , https://stackoverflow.com/a/14737103/5499118 :
{ { ./aaa.sh | tee bbb.out; } 2>&1 1>&3 | tee ccc.out; } 3>&1 1>&2
Como verifiquei, funciona conforme explicado. A resposta leva para https://unix.stackexchange.com/a/18904/266260 , que leva para https://unix.stackexchange.com/a/3540/266260 .
Não entendo por que { ... 1>&3 ... } 3>&1
funciona (como o redirecionamento posterior reverte o efeito do anterior), porque quando eu queria entender man bash:
Observe que a ordem dos redirecionamentos é significativa. Por exemplo, o comando
ls > dirlist 2>&1
direciona a saída padrão e o erro padrão para o arquivo dirlist, enquanto o comando
ls 2>&1 > dirlist
direciona apenas a saída padrão para o arquivo dirlist, porque o erro padrão foi duplicado da saída padrão antes que a saída padrão fosse redirecionada para dirlist.
Encontrei duplicação de descritores de arquivo no redirecionamento :
Os redirecionamentos são implementados por meio da família de funções do sistema dup. dup é a abreviação de duplicação e quando você faz isso, por exemplo:
3>&2
você duplica (dup2) o filedescriptor 2 no filedescriptor 3 ...
Portanto, entendo que 1>&3
duplica 3 em 1 e eles apontam para o mesmo objeto a partir desse comando man dup
.
Após um retorno bem-sucedido, os descritores de arquivo antigo e novo podem ser usados indistintamente. Eles se referem à mesma descrição de arquivo aberto.
Pela dup
explicação, não espero 3>&1
mudar nada, pois 3 e 1 já são iguais. Mas aparentemente não é o caso, pois omitir 3>&1
dos { { ./aaa.sh | tee bbb.out; } 2>&1 1>&3 | tee ccc.out; } 3>&1 1>&2
resultados embash: 3: bad file descriptor
O que (se houver) está incorreto ao explicar o redirecionamento com dup
chamadas? O que acontece internamente durante 1>&3
e 3>&1
? Talvez { }
sejam importantes aqui, mas vejo que são usados apenas para agrupamento e por man bash
:
list é simplesmente executado no ambiente de shell atual.