A diretiva de linha de comando > ocorre antes que o comando ls seja executado. O shell tem que estar pronto para salvar a saída que o comando ls pode produzir, portanto, ele deve criar e abrir o arquivo para gravação.
Quando ls é executado pelo shell, o arquivo foo existe e, portanto, ls envia "foo", que é o que você encontrou no arquivo foo .