Que tal uma abordagem mais simples?
while read line do
grep "^$line$" file2.txt >>matches.txt
done < file1.txt
Explicação:
Isso percorre file1.txt linha por linha e usa grep para procurar a linha exata em file2.txt . Agora, grep produzirá a linha novamente se conseguir corresponder em file2.txt e, em seguida, será redirecionada (anexada) ao arquivo matches.txt .
A razão pela qual seu script está travando é que seu segundo loop está aguardando entrada em stdin : você esqueceu de tornar sua stdin uma duplicata do descritor de arquivo 3 como você fez com a primeira. Em qualquer caso, nenhum descritor de arquivo extra precisa ser criado: você pode apenas redirecionar stdin para que o loop while seja lido de um arquivo e não do terminal.