Хотя вы уже решили свою проблему самостоятельно, я хочу немного уточнить.
Почему ваш псевдоним не работает:
@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
как указано в связанном ответе.)