Хотя вы уже решили свою проблему самостоятельно, я хочу немного уточнить.
Почему ваш псевдоним не работает:
@evilsoup уже намекал на это, но четко заявил: псевдонимы (в zsh и bash) не могут принимать аргументы (тогда как в csh они могут). Думайте об этом как о простой замене строк. Следовательно, с alias cd='cd $1;ls' , команда cd foo расширяется до cd ; ls foo потому что $1 пусто (не определяется в этом контексте), и вы видите содержимое foo/ но оболочка делает cd в текущий каталог (без аргумента после cd).
Почему ваша функция как в вопросе не работает:
Вы определяете функцию cd , которая сама вызывает cd . Таким образом, вы в конечном итоге в бесконечном цикле. Текущая версия zsh (5.0.2) не работает по умолчанию, но выдает ошибку:
cd:1: maximum nested function level reached
Решение состоит в том, чтобы использовать builtin cd внутри вашей функции cd - как вы уже разработали сами.
Почему ваша функция (оттуда) может быть улучшена
Вы переопределяете функцию cd . Это прекрасно работает, если вы называете это явно. Но zsh предлагает опцию AUTO_CD (устанавливается с помощью setopt AUTO_CD):
Если выдается команда, которая не может быть выполнена как обычная команда, а команда является именем каталога, выполните команду cd для этого каталога.
Это означает, что вы можете перейти в /var , просто набрав /var вместо cd /var . В этом случае ваша функция cd не вызывается, и вы не видите содержимое /var автоматически.
pushd и popd - другие случаи, когда переопределенная команда cd не помогает.
Путь ZSH
Стефан Чазелас в SE/UL уже дал способ zsh-ish, как отметил @evilsoup в комментариях: не переопределяйте cd , но используйте функцию chpwd() , которая существует именно по этой причине:
chpwd Выполняется всякий раз, когда текущий рабочий каталог изменяется.
Так что просто добавьте
function chpwd() {
ls
}
к вашему ~/.zshrc . (Краткая форма это chpwd() ls как указано в связанном ответе.)