Aliases de bash específicos do diretório

Ao usar o Docker para desenvolvimento, especialmente o Docker Compose, os comandos que costumavam ser curtos e agradáveis ​​nos dias anteriores ao Docker acabam se tornando mais longos para encaminhar comandos por meio de um contêiner em execução, por exemplo

docker-compose run web rails g controller users 

Embora existam algumas soluções óbvias, como definir aliases em sua configuração de shell, por exemplo

alias web="docker-compose run web"

isso exige que você adote convenções globais que nem sempre se aplicam se você estiver colaborando em vários projetos.

Embora o seguinte hack do shell possa certamente ser usado em qualquer contexto, eu o uso principalmente para definir o escopo de comandos para árvores de diretório específicas em minha caixa de desenvolvimento. Assim, ao sair da árvore, tudo fica limpo, evitando o inchaço global.

Primeiro, adicione as seguintes funções à configuração do bash – diretamente em ~ / .bashrc ou em um arquivo separado que é então obtido por seu .bashrc:

function on_leave_dir() {
if [ -e .aliases ]; then
export OLD_ALIAS_DIR="$PWD"
fi
}

function on_enter_dir() {
if [ -n "$OLD_ALIAS_DIR" ] && ! is_subdirectory "$PWD" "$OLD_ALIAS_DIR" ; then
aliases
="$OLD_ALIAS_DIR/.aliases"

while IFS=':' read -r key value || [ -n "$key" ]; do
unalias
"$key" > /dev/null 2>&1
done < $aliases

unset OLD_ALIAS_DIR

echo
"Unloaded local aliases"
fi

if [ -e .aliases ]; then
while IFS=':' read -r key value || [ -n "$key" ]; do
alias "$key"="${value##*( )}"
done < ".aliases"

echo
"Loaded local aliases"
fi
}

function is_subdirectory() {
local child="$1"
local parent="$2"
if [[ "${child##${parent}}" != "$child" ]]; then
return 0
else
return 1
fi
}

function cd() {
on_leave_dir

builtin cd
"$@"
on_enter_dir

}

Em seguida, em qualquer diretório que você gostaria de acionar um ou mais aliases, adicione um arquivo .aliases, usando um formato de valor-chave simples:

logs: docker-compose logs web
rails
: docker-compose run --rm web rails

Agora, sempre que entrar nesse diretório, você pode executar os comandos (curtos e agradáveis):

rails g controller users 

Embora o comando acima pareça um executável normal do Rails, na verdade é um alias que está encaminhando o comando para o executável do Rails em execução dentro do meu contêiner do Docker.

Você também pode redefinir os aliases em outros diretórios usando os mesmos nomes de chave sem conflitos.