Em ambos os casos, o * é expandido pelo shell.
echo apenas imprime os parâmetros resultantes da expansão.
ls verifica cada parâmetro se for um diretório e lista seu conteúdo, se for um.
Por exemplo, se você estiver no diretório home e digitar ls * , terá todos os diretórios listados e, abaixo do nome do diretório listado, os arquivos que ele contém. Por outro lado, se você digitar echo * , o comando listará apenas os diretórios, e não os diretórios e o conteúdo que eles têm. Por que isso?
Em ambos os casos, o * é expandido pelo shell.
echo apenas imprime os parâmetros resultantes da expansão.
ls verifica cada parâmetro se for um diretório e lista seu conteúdo, se for um.