6

С zshoh-my-zsh) можно ли всегда запускать команду после определенной другой команды? Я хочу всегда запускать ls после cd в каталог, а не запускать cd example; ls каждый раз.

Я пытался:

function cd {
  cd $1
  ls
}

Но, похоже, он zsh без вывода (переполнение стека?). Изменение имени функции заставляет ее работать так, как задумано, однако я бы предпочел использовать команду cd .

alias cd='cd $1;ls'

Перечисляет указанный каталог, но фактически не меняет рабочий каталог.

Можно ли это сделать, и если да, то как?

2 ответа2

10

Хотя вы уже решили свою проблему самостоятельно, я хочу немного уточнить.

Почему ваш псевдоним не работает:

@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 как указано в связанном ответе.)

4

Этот пост на Unix/Linux решил это для меня:

function cd {
  builtin cd "$@" && ls -F
}

Это про bash, но у меня работает в zsh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .