Em seu exemplo simplificado, você tem dois processos (seu shell e o gato ) tentando ler do lado “escravo” do tty. O resultado é que um processo recebe alguns dos personagens, o outro recebe os outros.
O que você quer dizer com "redirecionar a entrada de um [terminal] para o outro"? Na sua situação real, quais processos estão tentando ler de cada terminal? O que você quer fazer com sua entrada capturada depois de tê-la? O que, exatamente , você está realmente tentando realizar?
Para mim, "redirecionar o io de um processo em execução no gdb" parece mais como reabrir o stdin / stdout / stderr dentro de um processo que já está em execução.
Você pode alterar stdin / stdout / stderr de um processo em execução com (entre outras coisas ) GDB. Uma resposta para “Redirecionar STDERR / STDOUT de um processo APÓS ter sido iniciado, usando a linha de comando?” mostra como isso pode ser feito. Você gostaria de substituir um nome de caminho tty por /dev/null
na resposta e provavelmente deseja manipular stdin também, mas a técnica ainda é aplicável.
Você deve ser capaz de fazer seu exemplo simplificado funcionar de forma robusta, mas não estou convencido de que ele faça o que você realmente quer fazer (lembre-se que um pseudo terminal é na verdade um par de dispositivos, como duas extremidades de um tubo bidirecional; mas todo o seu exemplo interage com as metades 'escravas').
A chave para consertar seu exemplo é fazer com que todos, exceto um dos processos concorrentes, interrompam (temporariamente) a leitura do terminal. Se, como o seu exemplo, você tem um shell rodando no lado do qual você gostaria de capturar dados, então você pode fazer algo assim:
(
s="$(stty -g)"
exec 3<&0
trap 'stty "$s" 0<&3;exit' 0 INT QUIT
cat <<EOM
In some other terminal, run the command
cat <$(tty)
Press ^C or ^\ to quit.
EOM
stty raw isig brkint susp '' dsusp ''
while true; do sleep 3600; done </dev/null
)