Eu percebi isso, obrigado pelos caras dos ponteiros. O problema aqui era que o grep estava procurando recursivamente por "TODO:" no arquivo todo.txt e, em seguida, gravando os resultados de volta para o arquivo todo.txt. Quando abri o todo.txt, ele foi preenchido com o mesmo texto em loop repetidamente. Evidentemente, eu deveria ter usado a opção --exclude="todo.txt"
em grep
. Depois de adicionar isso, funciona perfeitamente.