Depois de começar:
rm -i -- * &
rm
foi iniciado com o stdin em seu shell no momento em que você chamou esse comando.
Se fosse o terminal, então rm
normalmente seria suspenso (com o sinal SIGTTIN) assim que tentasse ler a partir dele (já que não está no grupo de processos de primeiro plano do terminal).
Se você quiser ler de outra coisa, você tem que dizer para reabrir o descritor de arquivo 0 em outra coisa.
Você poderia fazer isso com um depurador (assumindo aqui que está no Linux):
rm_pid=$!
coproc yes
gdb --pid="$rm_pid" --batch \
-ex "call close(0)" \
-ex "call open(\"/proc/$$/fd/$COPROC\", 0)" /bin/rm
kill -s CONT "$rm_pid"
Acima, estamos começando yes
em segundo plano com stdin e stdout redirecionados para um canal. A outra extremidade desse pipe está no shell (processo $$
) no descritor de arquivo ${COPROC[0]}
aka $COPROC
.
Depois, com gdb
, estamos dizendo rm
para fechar seu fd 0 e reabri-lo no mesmo canal.