![覆盖 cd 内置的源环境设置,可以与 autocd 一起使用吗?](https://linux22.com/image/876312/%E8%A6%86%E7%9B%96%20cd%20%E5%86%85%E7%BD%AE%E7%9A%84%E6%BA%90%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%B8%8E%20autocd%20%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E5%90%97%EF%BC%9F.png)
我目前正在覆盖内置cd
命令,以根据当前正在构建的环境来获取环境文件。
我的主要问题与 how 运行有关,cd
当我shopt -s autocd
启用依赖来autocd
访问特定目录时,我的source
行不会被执行。我在哪里可以找到有关 howautocd
运行的更多信息cd
以及为什么它仅在明确调用时才有效cd
?
我的.bashrc
包含这个用于“自动采购”:
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
}
我知道这有点危险,可能会产生意想不到的后果,但我现在可以忍受。如果有更好的解决方案可以在cd
进入目录时自动获取环境变量列表,我愿意倾听。
答案1
我找不到 的内部文档autocd
,恐怕你得查看源代码。但是,正如 Glenn 指出的那样,如果在使用 时没有执行此操作autocd
,则autocd
可能没有使用cd
。
我能想到两种解决方法。首先,你可以使用PROMPT_COMMAND
Glenn 建议的方法。将其添加到你的.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"
现在,每次进入这些目录时,无论您如何进入,都会获取文件。这种方法的一个主要缺点是,每次显示提示时都会获取文件,而不仅仅是在您第一次进入目录时。您可以通过在源文件中设置一个变量并仅在未设置该变量时获取文件来避免这种情况,但这确实变得相当复杂。
我建议你设置别名,以便移动到每个目录并获取相关文件。将这些行添加到你的~/.bashrc
(source
实际上是 的别名,.
但.
更易于移植):
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"
现在,您可以运行staging
以移动到暂存目录并获取相关文件。其他两个也一样。