繁体   English   中英

Bash 脚本在目录中运行命令

[英]Bash script to run commands if in directory

目标:如果在目录中,自动执行 bash 命令。

例如,如果我进入git项目目录,我希望 bash 为我运行以下命令:

  • 康达激活
  • 导出 VAR_NAME=foo

我尝试附加到~/.bashrc ,但没有运气:

...
if [ -f "/home/me/PycharmProjects/project/" ]; then
    conda activate project_venv
    export KEY=foo
    export SECRET=bar
fi

实施方案

~/.bashrc

# ...
cd () {
    command cd "$@" &&
    if [[ $(pwd) = '/home/me/PycharmProjects/project1' ]]; then
        conda activate project1
        ~/miniconda3/etc/activate.d/env_vars.sh
    elif [[ $(pwd) = '/home/me/PycharmProjects/project2' ]]; then
        conda activate project2
    else
        ~/miniconda3/etc/deactivate.d/env_vars.sh
    fi
}

激活 conda 环境有效!

但是, export不起作用。

~/miniconda3/etc/activate.d/env_vars.sh

#!/bin/sh

export KEY=foo
export SECRET=bar

~/miniconda3/etc/deactivate.d/env_vars.sh

#!/bin/sh

unset KEY
unset SECRET

我跑了:

chmod 777 ~/miniconda3/etc/activate.d/env_vars.sh
chmod 777 ~/miniconda3/etc/deactivate.d/env_vars.sh

当我在任何项目中运行代码时,我得到:

decouple.UndefinedValueError: KEY not found. Declare it as envvar or define a default value.

您可以将此 function 添加到您的~/.bashrc

cd () { 
    command cd "$@" &&
    if [[ $(pwd) = '/home/me/PycharmProjects/project' ]]; then
        conda activate project_venv
        export KEY=foo SECRET=bar
    fi
}

您可以设置PROMPT_COMMAND ,请参阅 bash 文档。 Bash 在每次提示之前执行它的值(或者如果它是一个数组,它的每个值),所以当PWD改变时你可以做任何你想做的事情。

因为您要在 function 中导出,所以您需要使用declare -gx declare --help将为您提供最好和最准确的原因,但这是因为所有 function 变量在技术上都是local 如果不在 function 中,则忽略-g为 function 创建全局导出变量,并且-xexport的别名。 export只是declare -x 您还需要获取脚本文件

所以它看起来像这样

declare -gx KEY=foo
declare -gx SECRET=bar
cd () {
    command cd "$@" &&
    if [[ $(pwd) = '/home/me/PycharmProjects/project1' ]]; then
        conda activate project1
        source ~/miniconda3/etc/activate.d/env_vars.sh
    elif [[ $(pwd) = '/home/me/PycharmProjects/project2' ]]; then
        conda activate project2
    else
       source ~/miniconda3/etc/deactivate.d/env_vars.sh
    fi
}

完全披露我不确定-x是否完全必要,但我会在采购脚本的情况下这样做。

同样将秘密存储在~/.bashrc中也是一个普遍的禁忌,因为它会导致不良行为者获取秘密。 除了减慢交互式 shell 加载时间之外

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM