3 votes

Remplacer le cd builtin par les paramètres de l'environnement source, possible à utiliser avec autocd ?

Je suis actuellement en train de remplacer la fonction intégrée cd pour créer un fichier d'environnement basé sur l'environnement en cours de construction.

Ma principale question est de savoir comment cd fonctionne quand j'ai shopt -s autocd activé - en s'appuyant sur autocd pour accéder aux répertoires spécifiques, mon source ne sont pas exécutées. Où puis-je trouver plus d'informations sur la façon dont autocd exécute cd et pourquoi cela ne fonctionne qu'en appelant explicitement cd ?

Mon .bashrc contient ceci pour le "sourcing automatique" :

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

}

Je sais que c'est un peu dangereux et que cela pourrait avoir des conséquences inattendues, mais je peux vivre avec ça pour le moment. S'il existe une meilleure solution pour sourcer automatiquement une liste de var d'environnement lorsque cd dans un dir, je suis tout ouïe.

2voto

Stewart Points 1385

Je ne peux pas trouver où les internes de autocd sont documentés, je crains que vous deviez vérifier le code source. Cependant, comme Glenn le souligne, si cette opération n'est pas exécutée lors de l'utilisation de autocd entonces autocd n'utilise probablement pas cd .

Je pense à deux solutions de contournement. Premièrement, vous pouvez utiliser PROMPT_COMMAND comme Glenn l'a suggéré. Ajoutez ceci à votre .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"

Maintenant, chaque fois que vous vous déplacez dans ces répertoires, quelle que soit la façon dont vous y êtes arrivé, les fichiers seront sourcés. L'inconvénient majeur de cette approche est que les fichiers seront recherchés à chaque fois qu'une invite sera affichée, et pas seulement lorsque vous vous déplacerez pour la première fois dans le répertoire. Vous pourriez éviter ce problème en définissant une variable dans le fichier source et en ne créant une source que si cette variable n'est pas définie, mais cela devient vraiment très complexe.

Je vous suggère plutôt de mettre en place des alias pour vous déplacer dans chacun des répertoires et rechercher les fichiers pertinents. Ajoutez ces lignes à votre ~/.bashrc ( source est en fait un alias pour . mais . est plus portable) :

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"

Maintenant, vous pouvez exécuter staging pour aller dans le répertoire staging et créer le fichier correspondant. La même chose pour chacun des deux autres.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X