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:
chpwd
Executed 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.)