Embora você já tenha resolvido seu problema, eu quero elaborar um pouco.
Por que seu alias não funciona:
@eviloup já deu a entender, mas para afirmar claramente: Os aliases (em zsh e bash ) não são capazes de receber argumentos (enquanto em csh eles podem). Pense nisso como uma simples substituição de string. Assim, com alias cd='cd $1;ls' definido, o comando cd foo expande para cd ; ls foo porque $1 está vazio (não definido neste contexto) e você vê o conteúdo de foo/ , mas o shell usa cd no < em> diretório atual (sem argumento após cd ).
Por que sua função, como na pergunta, não funciona:
Você define uma função cd , que chama cd . Então você acaba em um loop infinito. A versão atual do zsh (5.0.2) não segfault, mas dá um erro:
cd:1: maximum nested function level reached
A solução é usar builtin cd dentro de sua função cd - como você já trabalhou sozinho.
Por que sua função (do existente ) pode ser melhorada
Você está redefinindo a função cd . Isso funciona bem, se você chamar explicitamente. Mas o zsh oferece a opção AUTO_CD (a ser definida com setopt AUTO_CD ):
If a command is issued that can't be executed as a normal command, and the command is the name of a directory, perform the cd command to that directory.
Isso significa que você pode mudar para /var simplesmente digitando /var em vez de cd /var . Nesse caso, sua função cd não é chamada e você não visualizou o conteúdo de /var automaticamente.
pushd e popd são outros casos em que um comando cd redefinido não ajuda .
O caminho ZSH
Stephane Chazelas na SE / UL já deu o caminho certo, como destacado por @eviloup in os comentários: Não redefina cd , mas use a função de gancho chpwd() , que está lá exatamente por esse motivo:
chpwdExecuted whenever the current working directory is changed.
Então, basta adicionar
function chpwd() {
ls
}
para o seu ~/.zshrc . (Uma forma abreviada disso é chpwd() ls , conforme fornecido na resposta vinculada.)