A resposta curta: sim, você vai ter que usar o Expect.
Quanto a por que está falhando: com base em seu comportamento, bash -i ativa readline (mesmo com --noediting ), que é bastante prejudicado com pipes. Ele também parece estar definindo modos de terminal (incluindo o modo sem bloqueio) via stdout em vez de stdin , o que significa que você perde o comportamento esperado da maioria dos caracteres de controle. (Não é, no entanto, ler o tty diretamente.)
Nota lateral: ^C envia SIGINT , não SIGTERM . Ambos estão, no entanto, presos no modo interativo ( -i ); SIGHUP trabalha para matá-lo.