Подтвердить что ты не робот

Выполнение функции bash при вводе каталога

Я хотел бы выполнить определенную функцию bash при вводе нового каталога. Что-то вроде:

alias cd="cd [email protected] && myfunction"

[email protected] там не работает, и добавление обратной косой черты не помогает. Я также немного беспокоюсь о том, чтобы возиться с cd, и было бы неплохо, если бы это сработало для других команд, которые меняли каталог, например pushd и popd.

Любые лучшие псевдонимы/команды?

4b9b3361

Ответ 1

Самое легкое решение, которое я могу придумать, - это

myfunction() {
  if [ "$PWD" != "$MYOLDPWD" ]; then
    MYOLDPWD="$PWD";
    # strut yer stuff here..
  fi
}

export PROMPT_COMMAND=myfunction

Это должно быть сделано. Он будет работать со всеми командами и будет запущен до появления подсказки.

Ответ 2

Псевдонимы не принимают параметры. Вы должны использовать функцию. Нет необходимости выполнять его автоматически при каждом выпуске приглашения.

function cd () { builtin cd "[email protected]" && myfunction; }

Ключевое слово builtin позволяет вам переопределить встроенный Bash без создания рекурсии. Цитирование параметра заставляет его работать, если в именах каталогов есть пробелы.

Bash docs говорят:

Для почти каждой цели функции оболочки предпочтительнее над псевдонимами.

Ответ 3

Есть несколько других версий этого, в том числе

  • smartcd, который я написал, и имеет массу функций, включая сохранение шаблонов и сохранение временных переменных
  • ondir, который меньше и намного проще

Оба из них поддерживают как bash, так и zsh

Ответ 4

Я написал сценарий ZSH, использующий функцию обратного вызова chpwd для создания исходных конфигураций ZSH проекта. Я не уверен, что это работает с Bash, но я думаю, что стоит попробовать. Если он не найдет файл сценария в каталоге, в который вы переходите, он будет проверять родительские каталоги, пока не найдет сценарий для источника (или пока он не достигнет /). Он также вызывает функцию unmagic при cd'ing вне каталога, которая позволяет вам очистить вашу среду при выходе из проекта.

http://github.com/jkramer/home/blob/master/.zsh/func/magic

Пример для "волшебного" скрипта:

export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b

ctags -R --languages=Perl $PWD # update ctags file when entering the project directory

export PERL5LIB="$BASE/lib"

# function that starts the catalyst server
function srv {
  perl $BASE/script/${PROJECT_NAME}_server.pl
}

# clean up
function unmagic {
  unfunction src
  unset PERL5LIB
}