Como faço para que o T imprima todos os descritores de arquivos na tela, mas salve apenas o stdout no arquivo?

2

Suponha que meu programa imprima em vários descritores de arquivo e eu precise assistir a todas as saídas enquanto elas estão sendo impressas, mas salve apenas stdout em um arquivo. Como eu faço isso?

    
por Will 19.11.2015 / 21:35

1 resposta

2

Suponha que 3 seja um desses descritores de arquivo nos quais você está interessado. 3 pode estar apontando para file , por exemplo:

exec 3>file

Seu aplicativo grava em 3:

app() { echo hello world >&3; }

Se você quiser interceptar 3, precisará dup para outro descritor de arquivo (por exemplo, 4):

exec 4>&3

e redireciona (= substitui) 3 com um pipe para o seu processo de interceptor, que tem que escrever de volta para o alvo original (ou então não seria um interceptador), que agora é salvo em fd 4:

app 3> >(tee /dev/tty >&4) #this interceptor writes to the terminal

O texto acima deve imprimir hello world para o terminal e file deve acabar com hello world .

Tudo isso pressupõe que esses descritores de arquivos estejam abertos antes de você iniciar o processo. Se você quiser interceptar saídas filedescriptor dinamicamente em tempo de execução, então eu tenho medo que você tenha que modificar o código, injetar código em tempo de execução ou interceptar chamadas do sistema com algo como ptrace .

    
por 19.11.2015 / 22:15

Tags