Substituindo cd embutido para configurações de env de origem, possível usar com autocd?

3

No momento, estou substituindo o comando cd incorporado para criar um arquivo de ambiente com base no ambiente que está sendo construído atualmente.

A minha questão principal diz respeito a como cd é executado quando tenho shopt -s autocd ativado - contando com autocd para chegar aos diretórios específicos, minhas source lines não são executadas. Onde posso saber mais sobre como autocd é executado em cd e por que isso funciona somente quando chama explicitamente cd ?

Meu .bashrc contém isso para o "auto sourcing":

cd() {
  builtin cd "$@"

  if [[ 'pwd' == '/home/ubuntu/deploys/staging' ]]; then
    echo "Sourcing ~/.appconfig/staging.env!";
    source /home/ubuntu/.appconfig/staging.env;
  fi

  if [[ 'pwd' == '/home/ubuntu/deploys/demo' ]]; then
    echo "Sourcing ~/.appconfig/demo.env!"
    source /home/ubuntu/.appconfig/demo.env;
  fi

  if [[ 'pwd' == '/home/ubuntu/deploys/prod' ]]; then
    echo "Sourcing ~/.appconfig/prod.env!"
    source /home/ubuntu/.appconfig/prod.env;
  fi

}

Eu sei que isso é um pouco perigoso e pode ter consequências não intencionais, mas eu posso viver com isso por enquanto. Se houver uma solução melhor para obter automaticamente uma lista de variáveis de ambiente quando cd ing em um diretório, sou todo ouvidos.

    
por Brian 28.09.2015 / 21:58

1 resposta

2

Não consigo encontrar onde os componentes internos de autocd estão documentados. Infelizmente, você precisará verificar o código-fonte. No entanto, como Glenn aponta, se isso não for executado ao usar autocd , então autocd provavelmente não está usando cd .

Eu posso pensar em duas soluções alternativas. Primeiro, você pode usar PROMPT_COMMAND como Glenn sugeriu. Adicione isto ao seu .bashrc :

sourcedir() {

  if [[ 'pwd' == '/home/ubuntu/deploys/staging' ]]; then
    echo "Sourcing ~/.appconfig/staging.env!";
    source /home/ubuntu/.appconfig/staging.env;
  fi

  if [[ 'pwd' == '/home/ubuntu/deploys/demo' ]]; then
    echo "Sourcing ~/.appconfig/demo.env!"
    source /home/ubuntu/.appconfig/demo.env;
  fi

  if [[ 'pwd' == '/home/ubuntu/deploys/prod' ]]; then
    echo "Sourcing ~/.appconfig/prod.env!"
    source /home/ubuntu/.appconfig/prod.env;
  fi

}

PROMPT_COMMAND="sourcedir"

Agora, cada vez que você acessar esses diretórios, independentemente de como você chegou lá, os arquivos serão originados. Uma grande desvantagem dessa abordagem é que os arquivos serão originados sempre que um prompt for exibido, não apenas quando você for movido pela primeira vez para o diretório. Você pode evitar isso definindo uma variável no arquivo originado e somente sourcing se essa variável não estiver definida, mas isso está realmente ficando bastante complexo.

Em vez disso, sugiro que você configure aliases para mover para cada um dos diretórios e obter os arquivos relevantes. Adicione essas linhas ao seu ~/.bashrc ( source é, na verdade, um alias para . , mas . é mais portátil):

alias staging="cd /home/ubuntu/deploys/staging && . /home/ubuntu/.appconfig/staging.env"
alias demo="cd /home/ubuntu/deploys/demo && . /home/ubuntu/.appconfig/demo.env"
alias prod="cd /home/ubuntu/deploys/prod && . /home/ubuntu/.appconfig/prod.env"

Agora, você pode executar staging para acessar o diretório temporário e criar o arquivo relevante. O mesmo para cada um dos outros dois.

    
por terdon 29.09.2015 / 14:13