当前位置: 代码迷 >> python >> 在python或bash(或两者)中为终端会话的范围设置环境变量
  详细解决方案

在python或bash(或两者)中为终端会话的范围设置环境变量

热度:51   发布时间:2023-07-14 09:53:21.0

我想为终端会话的范围设置环境变量。

例如,用户将打开一个终端,输入诸如setproject <project_name> ,并将导出环境变量PROJECT 当他们关闭端子时,变量设置将丢失。 该系统令人印象深刻的是,它将知道什么项目名称有效,什么无效。 我在做得很好的地方工作过,我想知道它是如何完成的。

我希望用户不必键入source setproject <project_name>并且我还想检查他们指定的项目是否有效。

我已经在python中编写了一些东西,它检查项目名称的有效性(针对yaml配置文件),并将其传递给bash脚本,但是它实际上没有用(环境变量未正确设置)。已设置,但仅用于python脚本的范围)

那么,我该怎么做呢? 有什么很好的例子可以说明我在网上寻找什么吗?

您不能使用普通命令来执行此操作-普通命令(shell脚本,python脚本,二进制文件等)在主shell进程下作为子进程运行,并且不会影响主shell进程的环境。 但是外壳程序支持在外壳程序本身中“发生”的几个类似命令的事物:函数和别名。 都需要在外壳中定义它们,然后才能使用它们,因此您需要将定义放入.bash_profile中(或安装程序中合适的外壳初始化文件中的任何内容-参见 )。

我这样做的方法是将setproject定义为shell函数,如下所示:

# ...in shell init file...
setproject() {
    if [ some_test_for_project_validity ]; then
        export PROJECT="$1"
    else
        echo "setproject: $1 is not a valid project name" >&2
        return 1
    fi
}

你需要这里的逻辑是太复杂,放在一个别名(他们更简单,比功能笨),但你可以把实际的脚本在一个单独的文件,并使用别名来避免明确source是:

# ...in shell init file...
alias setproject='source /path/to/setproject'

# .../path/to/setproject...
# note no shebang, since it won't be run as a normal command
if [ some_test_for_project_validity ]; then
    export PROJECT="$1"
else
    echo "setproject: $1 is not a valid project name" >&2
    return 1    # In a file to be source'd, use return instead of exit
fi