Напишите следующий скрипт:
#!/bin/sh
projdir1="$HOME/project/aardvark"
playdir1=/bin/play1.2.4
projdir2="$HOME/project/battlestar"
playdir2=/bin/play2.2.0
︙
case "$PWD" in
"$projdir1" | "$projdir1"/*)
export PATH="$playdir1":"$PATH"
;;
"$projdir2" | "$projdir2"/*)
export PATH="$playdir2":"$PATH"
;;
︙
*)
echo "I don't know which version of \"play\" to use in $PWD"
exit 1
esac
exec $(basename "$0") "$@"
Поместите его в каталог bin
с именем play
, со ссылками на имена любых других команд, которые находятся в каталоге play
(если есть).
Теперь вы можете просто набрать нужную команду, и скрипт определит, какую версию запустить.
(Конечно, ваш каталог приватных bin
должен находиться в начале вашей PATH
, перед любой игрой! Рамки каталогов.)
Если вы хотите ввести такие команды, как
play project/aardvark/foo
в то время как в вашем домашнем каталоге, это потребует немного больше работы.
Если вы хотите быть в состоянии сделать
play ../battlestar/bar
в то время как в projects/aardvark
это будет несколько сложнее.
Недостаток вышеупомянутого заключается в том, что сценарий play
в каталоге bin
должен обновляться всякий раз, когда вы определяете новый проект (или переопределяете старый).
Вот подход, который позволяет локализовать информацию о конфигурации в каталогах проекта:
#/bin/sh
case "$PWD" in
"$HOME"/*)
# OK
;;
*)
echo "This script should be used only within your home directory tree."
exit 1
esac
rcfile=".playrc"
while [ ! -f "$rcfile" ]
do
rcfile="../$rcfile"
done
. "$rcfile"
exec $(basename "$0") "$@"
Затем поместите файл .playrc
в корневой каталог каждого проекта, сказав
export PATH="play_dir_for_this_project":"$PATH"
и поместите файл .playrc
в свой домашний каталог, говоря
echo "You aren’t in a \"play\" project directory."
exit 1
в качестве отступника.
Лучшая обработка ошибок может быть добавлена и оставлена как упражнение.