No linux, você pode endereçar os descritores de arquivos de um aplicativo como arquivos nomeados em /dev/fd/[0-9]
. E o que você definitivamente pode fazer com um arquivo nomeado e um fluxo de entrada é tee
da entrada nesse arquivo e para stdout. E então o que eu costumo fazer quando me encontro em sua situação (como sempre faço) é tee
de entrada para meu aplicativo de leitura e para /dev/fd/2
- stderr.
Assim:
seq 10 | tee /dev/fd/2 | wc -c
1
2
3
4
5
6
7
8
9
10
21
Claro, mesmo se você não estivesse em um sistema Linux, a mesma coisa poderia ser feita portavelmente - se menos especificamente em alguns casos - apenas fazendo ...| tee /dev/tty | ...
Se você está falando sobre o terminal quando diz stdin
(como seu link indica) , então você ainda pode fazer a mesma coisa, embora possa ser um pouco mais complicado dessa maneira por causa do buffer de linha do kernel. Então, o que eu faria nesse caso é registrar todo tty
i / o agrupando meu comando em luit
- porque eu acho que o mais conveniente dos dois - embora script
também pudesse funcionar da mesma forma maneira.
luit
provavelmente já está instalado em seu sistema - normalmente é empacotado com xterm
- e é uma ferramenta cli muito simples destinada a fazer traduções UTF-8 (cuja função pode ser desativada completamente via cli switch, mas eu nunca encontrei uma razão para fazê-lo) para aplicações de terminal que não entendem isso.
Funciona colocando em camadas a sua própria pty - para a qual possui o master fd - abaixo da camada tty atual e copiando toda a i / o da sessão atual para sua camada filha, onde ele executa o aplicativo solicitado. Como ele é o dono do master, ele pode facilmente duplicar todos os i / o que lê / escreve em outro lugar, e fornece um meio conveniente de fazer isso:
luit -olog /dev/fd/2 sh -c 'read var; echo "$var"'
eecchhoo tthhiiss vvaarr??????
echo this var???
echo this var???
Onde, como você pode ver, luit
logs para o arquivo -olog
nomeado, todos os dados recebidos do terminal são recebidos assim.
Usar /dev/fd/2
não é tão útil nesse caso - pois todo o i / o acaba no mesmo lugar duas vezes. Eu geralmente prefiro abrir um segundo terminal, consultar seu nome com o comando tty
e usar esse nome /dev/pts/[0-9]
como luit
/ script
chamado outfile - que copia todos os i / o para ambos terminais simultaneamente - para que eu possa ler / rever em um, e interagir com ele por outro. tee
pode ser usado para fazer a mesma coisa na maioria dos casos, mas normalmente não tem a vantagem do fim mestre de um artigo para recomendá-lo.
Se o seu objetivo é exatamente o que você diz - copiar para sua revisão toda a entrada de algum processo - então você provavelmente faria o melhor para se concentrar na entrada. strace
é útil para muitas coisas, mas se você estiver tentando obter um relatório preciso de comportamento típico, é lógico que provavelmente você modifique esse comportamento o mínimo possível ao coletar seu relatório. Em outras palavras, se você quiser entrada, copiar entrada, não insira um processo pai de depuração que irá -TRAP
e pause seu processo toda vez que fizer um syscall.