Como definir um alias por diretório?

18

Suponha que você tenha um alias go, mas deseja que ele faça coisas diferentes em diretórios diferentes?

Em um diretório, ele deve ser executado cmd1, mas em outro diretório, ele deve ser executadocmd2

A propósito, eu já tenho um alias para alternar para os diretórios acima, então é possível acrescentar a goatribuição do fooalias ao alias?

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

Trabalhando no bash (?) No OSX.

B Seven
fonte
1
É para isso que servem os makefiles.
itsbruce

Respostas:

16

Não está completamente certo o que você está perguntando, mas um alias apenas se expande para o que está no alias. Se você tiver dois aliases, poderá acrescentar os diferentes comandos, mesmo aliases.

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

Em qualquer outra situação, você pode especificar uma função no seu .bashrc

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

Caso você tenha mais opções, poderá usar melhor uma estrutura de caso.

Bernhard
fonte
4

Tenho a sensação de que você é muito "orientado a diretórios" e, nesse caso, isso pode ajustar sua mentalidade melhor.

(Mas, para ser sincero, acho que é uma péssima idéia, você gostaria que os comandos fossem globais.)

Em .bashrc, coloque alias go="./.cmd"(então source ~/.bashrc).

Em seguida, em cada diretório, coloque um script chamado .cmd, então chmod +x .cmd, gofaça o que quiser.

Emanuel Berg
fonte
2
Isso dá muito trabalho ... eis o caso de uso: Ao executar testes, quero alias rspec-all para executar determinados testes. Mas quais testes dependem do projeto. E isso é determinado pelo diretório
B
2
O que eu posso ver, você tem duas opções, use uma função (como @Bernhard descrita acima) e ramifique dependendo do diretório (como ele disse), ou você pode colocar os parâmetros nos diretórios. Pense bem, ele não precisa ser um script, você pode simplesmente colocar um arquivo ( touch .TESTNO; echo 2 > .TESTNO) em cada diretório e, em sua função, procurar esse arquivo e ramificar de acordo com o número de teste do arquivo .TESTNO contém. Embora não seja nada difícil, você provavelmente não pode usar um alias para isso; você deve usar uma função
Emanuel Berg
2

Estou trabalhando em um projeto que realiza exatamente isso. Confira: localidades .

Aqui está uma demonstração:

insira a descrição da imagem aqui

Engraçado, eu realmente usei gocomo exemplo na demo. Eu não mostrei os diretórios de alternância (algo que eu deveria alterar sobre a demonstração), mas as funções com o lacomando são realmente locais no diretório em que estão definidas.

Bryan Bugyi
fonte
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Coisa semelhante, mas assumindo que "go" é um comando do qual você deseja uma funcionalidade diferente em um diretório específico.

secondplanet
fonte
1

Se você adicionar a seguinte função ao seu .bashrc

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

Toda vez que você cd para um diretório com um arquivo .aliases, ele é obtido.

Cuidado com a segurança se outras pessoas puderem criar arquivos em sua máquina.

Com esse truque, os aliases nunca são removidos, mas você pode escrever o código que quiser na função.

ondir usa esse truque e tem uma tonelada de sinos e assobios.

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

teknopaul
fonte
Embora eu pense que isso é inteligente, parece que é perigoso, uma vez que depende .bashrc. (Isso não funcionará cron, por exemplo).
Ctbrown
Não tenho certeza se há algo perigoso no bashrc. Acredito que este é o local padrão / correto para aliases. É da natureza dos ambientes que eles são diferentes. Faça a pergunta: é necessário um ambiente diferente. Nada para impedir que você obtenha um .bashrc de usuários no cron se desejar que o cron tenha um ambiente semelhante . O cron NB sempre deve ter um comportamento diferente de um shell interativo devido ao uso de isatty e chums.
teknopaul
É verdade que não há nada perigoso no próprio bashrc. O problema é que você não tem como garantir que o processo que está mudando para o diretório tenha origem no bashrc. Uma coisa é a sua sessão interativa. Outra coisa é se esse diretório for compartilhado entre usuários e processos que podem ou não usar o shell bash. .bash_aliases é o local preferido para aliases de bash em alguns sistemas.
ctbrown