Как вы автоматически запускаете команду / скрипт оболочки при вводе / копировании каталога в Snow Leopard?

2731
Mark Scholtz

Извиняюсь, если ответ на этот вопрос очевиден, но я пока не смог его найти (возможно, потому что я ищу с неверной терминологией).

Я работаю на Mac под управлением Snow Leopard, и мне хотелось бы знать, можно ли автоматически запускать команду оболочки (или сценарий) при вводе / cd в этот каталог.

Пример, чтобы лучше проиллюстрировать мой вопрос: я использую RVM для управления версиями Ruby. Он использует аналогичную тактику с файлами проекта .rvmrc . Эти файлы запускаются при входе в каталог, в котором они содержатся, чтобы использовать правильную версию Ruby для этого конкретного проекта.

Я хотел бы сделать нечто подобное, чтобы отобразить содержимое файла todo.txt, когда я вхожу в эти файлы, содержащие каталог.

6
* Ввод * как в `cd`ing там? Daniel Beck 13 лет назад 0
Да "Вход" == "CD-ING" Mark Scholtz 13 лет назад 0

1 ответ на вопрос

7
Daniel Beck

Add the following to your ~/.bash_profile:

function cd { # actually change the directory with all args passed to the function builtin cd "$@" # if there's a regular file named "todo.txt"... if [ -f "todo.txt" ] ; then # display its contents cat todo.txt fi } 

It's possible you already have a similar function for cd — just extend that one to print the contents of todo.txt if it exists.

Это не будет работать с `popd` и` pushd`, если вы их используете. Измените их соответственно. Daniel Beck 13 лет назад 1
Большое спасибо за ответ! Я попытался добавить вышеупомянутый метод в мой ~ / .bash_profile, но кажется, что встроенный метод cd все еще вызывается, а не мой пользовательский метод cd. Я создал тестовый метод в своем ~ / .bash_profile, чтобы подтвердить, что добавленные там методы вызываются и действительно они есть. Mark Scholtz 13 лет назад 0
@ Отметьте в этом случае, что-то еще снова изменяет ваш `cd`, как я намекал в своем ответе - я написал только после того, как подтвердил, что он работает для меня. Найдите текущее определение `cd`, введя` shopt -s extdebug; объявить -F cd`. Кроме того, вам нужно начать новый сеанс оболочки или вручную загрузить `.bash_profile`, чтобы изменения произошли. Daniel Beck 13 лет назад 0
@ Даниил, кажется, что RVM является виновником. Результат выполнения этой команды привел к следующему: "cd 43 /Users/mark/.rvm/scripts/cd". Глядя на этот скрипт, я вижу, что он делает что-то в соответствии с тем, что вы предлагаете (он также запускает команду `builtin cd"% @ "`). Если я изменю свой файл ~ / .rmvrc, я смогу отключить эту функцию, которая затем позволит запустить мой пользовательский метод cd, но тогда я потеряю пользовательскую функциональность RVM. Мне придется прочитать документацию RMV, чтобы попытаться выяснить, могу ли я как-то использовать обе пользовательские функции CD. Mark Scholtz 13 лет назад 1
@Mark. Вы должны быть в состоянии добавить часть `if` моего определения функции к функции` cd` в этом файле, как я упоминал в последнем предложении моего ответа. Хотя зависит от того, как они реализуют свою функциональность. Daniel Beck 13 лет назад 0
@Daniel Я исправил проблему, создав файл в каталоге ~ / .rvm / hooks / с именем after_cd, который запускается самим RVM при вызове функции `cd`. Если кому-то интересно, как RVM обрабатывает изменения каталога, его создатель может найти отличный ответ [здесь] (http://stackoverflow.com/questions/5605277/how-does-rvm-detect-when-youve-changed-directories ) Mark Scholtz 13 лет назад 1