Как установить псевдоним для каждого каталога?

18

Предположим, у вас есть псевдоним go, но вы хотите, чтобы он делал разные вещи в разных каталогах?

В одном каталоге он должен работать cmd1, а в другом -cmd2

Кстати, у меня уже есть псевдонимы для переключения на вышеуказанные каталоги, так возможно ли добавить goпсевдоним для fooпсевдонима?

alias "foo=cd /path/to/foo"

Работаем в bash (?) На OSX.

Б Семерка
источник
1
Для этого и нужны make-файлы.
Брюс

Ответы:

16

Не совсем точно, что вы спрашиваете, но псевдоним просто расширяется до того, что в псевдониме. Если у вас есть два псевдонима, вы можете добавлять различные команды, даже псевдонимы.

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

В любой другой ситуации вы можете указать функцию в вашем .bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

Если у вас есть больше вариантов, вы можете лучше использовать структуру дел.

Бернхард
источник
4

У меня такое ощущение, что вы очень «ориентированы на каталоги», и в этом случае это может лучше подойти вашему менталитету.

(Но если честно, я думаю, что это вообще плохая идея, вы бы хотели, чтобы команды были глобальными.)

В .bashrc, положить alias go="./.cmd"(потом source ~/.bashrc).

Затем в каждом таком каталоге поместите скрипт с именем .cmd, а chmod +x .cmdзатем просто goсделайте свое дело.

Эмануэль Берг
источник
2
Это большая работа ... вот пример использования: при запуске тестов я хочу использовать псевдоним rspec-all для запуска определенных тестов. Но какие тесты зависят от проекта. И это определяется каталогом.
B Семь
2
Что я вижу, у вас есть две опции: либо использовать одну функцию (например, @Bernhard, описанную выше), и переходить в зависимости от каталога (как он сказал), либо вы можете поместить параметры в каталоги. Если подумать, это не обязательно должен быть сценарий, вы можете просто поместить файл ( touch .TESTNO; echo 2 > .TESTNO) в каждый каталог, а затем в своей функции найти этот файл и выполнить ветвление в соответствии с тем, какой номер теста у файла .TESTNO. содержит. Хотя это совсем не сложно, вы, вероятно, не можете использовать псевдоним для этого; Вы должны использовать функцию.
Эмануэль Берг
2

Я работаю над проектом, который выполняет именно это. Проверьте это: localalias .

Вот демо:

введите описание изображения здесь

Достаточно забавно, я фактически использовал goв качестве примера в демо. Я не показывал переключающие каталоги (что-то, что я должен изменить в демо), но функции с laкомандой действительно локальны по отношению к каталогу, в котором они определены.

Брайан Бугьи
источник
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Аналогичная вещь, но при условии, что «go» - это команда, для которой вам нужна другая функциональность в определенном каталоге.

secondplanet
источник
1

Если вы добавите следующую функцию в ваш .bashrc

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

Каждый раз, когда вы перейдете в каталог с файлом .aliases, он будет получен.

Будьте осторожны с безопасностью, если другие могут создавать файлы на вашем компьютере.

С помощью этого трюка псевдонимы никогда не удаляются, но вы можете написать столько кода, сколько захотите в функции.

Ондир использует этот трюк и имеет массу наворотов.

http://swapoff.org/ondir.html#download

teknopaul
источник
Хотя я думаю, что это умно, кажется, что это опасно, потому что это зависит .bashrc. (Это не будет работать cron, например).
ctbrown
Я не уверен, что есть что-то опасное в bashrc. Я считаю, что это стандартное / правильное место для псевдонимов. В природе сред они разные. Задайте вопрос, для этого требуется другая среда. Ничто не мешает вам использовать пользовательский .bashrc в cron, если вы хотите, чтобы cron имел похожую среду. NB cron всегда должен вести себя иначе, чем интерактивная оболочка, из-за использования isatty и chums.
Текнопауль
Правда, в самом bashrc нет ничего опасного. Проблема в том, что вы не можете гарантировать, что процесс, который меняется на каталог, будет исходным кодом bashrc. Одно дело, если это ваша интерактивная сессия. Совсем другое дело, если этот каталог является общим для пользователей и процессов, которые могут использовать или не использовать оболочку bash. .bash_aliases является предпочтительным местом для псевдонимов bash в некоторых системах.
ctbrown