at lê o comando para executar a partir da entrada padrão.
Você não está enviando o comando para executar at . Você está executando seu comando e enviando a saída do seu comando para at .
Tente algo como:
echo 'nohup nice MY_PROGRAM > foo.out 2> foo.err < /dev/null' | at 05:23
O comando echo imprimirá a string 'nohup nice MY_PROGRAM' e a | a passará para at .
Eu não sei por que você usa nohup , mas provavelmente você precisa, pois at empregos não são interativos .
P.S. Observe o uso de aspas simples ( ' ) para passar o comando para echo como uma string.