2013-07-12 2 views
4

Я разработчик python и чаще всего использую buildout для управления моими проектами. В этом случае мне не нужно запускать какую-либо команду для активации среды зависимостей.Запустить скрипт bash на `cd` command

Однако, когда-то я использую virtualenv, когда сборка сложна для данного конкретного случая.

Недавно я начал играть с рубином. И заметил очень полезную особенность. Enviurement автоматически меняется, когда я вв папку проекта. Это как-то связано с файлом rvm nad .rvmrc.

Мне просто интересно, есть ли способы подключить какой-либо скрипт к различным командам bash. Так что я могу workon environment_name автоматически, когда cd в папку проекта.

Поэтому логика так просто, как:

Когда вы cd в проекте с folder_name, чем сценарий должен запустить workon folder_name

+0

Возможный дубликат [Bash: пользовательский PS1 с хорошим рабочим каталогом пути] (http://stackoverflow.com/questions/5687446/bash-custom-ps1-with-nice-working-directory-path) – tripleee

+0

@tripleee Извините , но это совсем другой вопрос. – Pol

+0

@Pol: Если ваша оболочка поддерживает оценку произвольных выражений в PS1, вы должны написать функцию, которая обнаруживает, изменили ли вы каталоги с момента последнего приглашения, и является ли новый каталог в каталоге venv, и если это так активирует его. Но это было бы очень, очень глупо. :) – abarnert

ответ

10

Одной из особенностей Unix оболочек является то, что они позволяют создавать функции оболочки , которые очень похожи на функции на других языках; они по существу называются группами команд. Например, вы можете написать функцию с именем mycd, что первый работает cd, а затем запускает другие команды:

function mycd() { 
    cd "[email protected]" 
    if ... ; then 
     workon environment 
    fi 
} 

(. "[email protected]" расширяется к аргументам, которые вы прошли в mycd, так mycd /path/to/dir будем называть cd /path/to/dir)

В качестве специального случая функция оболочки фактически вытесняет встроенную команду с подобным именем; поэтому, если вы назовете свою функцию cd, она будет запущена вместо cd встроенной при каждом запуске cd. В этом случае для того, чтобы функция вызывала встроенный cd для выполнения фактического изменения каталога (вместо вызова самого себя, вызывающего бесконечную рекурсию), он может использовать встроенный Bash для builtin для вызова указанной встроенной команды. Итак:

function cd() { 
    builtin cd "[email protected]" # perform the actual cd 
    if ... ; then 
     workon environment 
    fi 
} 

(Примечание: Я не знаю, что ваша логика для распознавания каталога проекта, поэтому я оставил, что в качестве ... для вас, чтобы заполнить Если вы опишете вашу логику в комментариях, я. ll отредактируйте соответственно.)

+0

Спасибо. Это довольно очевидное решение. Я не думаю, что это путь рубинов. – Pol

+0

@Pol: Я не знаю о функции Ruby, о которой вы упоминаете, но я не вижу, что не так с «очевидным решением»! – ruakh

+0

не поймите меня неправильно. Я не сказал, что это не подходит. Я бы сказал, что это продвинутый путь. Я просто чувствую, что это немного для перекомпиляции команды cd для такого рода вещей. Я считаю, что есть более простые способы. – Pol

2

Я думаю, вы ищете одну из двух вещей.

autoenv - это относительно простой инструмент, который создает для вас соответствующие функции bash. По сути дела, это то, что предложил руах, но вы можете использовать его, не зная, как работает оболочка.

virtualenvwrapper полон инструментов, которые делают его проще строить умнее версию Баша функций-например, переключиться на venv, даже если вы cd в одном из его подкаталогов вместо основания или дорожки venvs, хранящийся в git или hg , или ... См. страницу Tips and Tricks.

Cookbook for autoenv, показывает некоторые изящные способы использования этих двух способов.

0

Просто найти в описании virtualenvwraper this topic

Он описывает именно то, что мне нужно.

Смежные вопросы