【问题标题】:Setting environment variables for the scope of a terminal session in python or bash (or both!)在 python 或 bash(或两者兼有!)中为终端会话的范围设置环境变量
【发布时间】:2019-02-27 00:01:17
【问题描述】:

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

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

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

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

那么,我是怎么做到的?我在网上寻找的东西有什么好的例子吗?

【问题讨论】:

  • 如果用户不调用命令,例如source,系统如何知道PROJECT 使用什么设置?
  • 环境变量是为 process 及其子进程的范围设置的,而不是为共享同一终端会话的进程设置的。所以使用像 python 这样的另一种语言进程永远无法工作。
  • 这是我的想法,所以它需要是一个 bash 脚本?

标签: python bash variables environment-variables environment


【解决方案1】:

您不能使用普通命令执行此操作——普通命令(shell 脚本、python 脚本、二进制文件等)作为主 shell 进程下的子进程运行,并且不会影响主 shell 进程的环境。但是 shell 支持一些在 shell 本身中“发生”的类似命令的事情:函数和别名。这两者都需要在 shell 中定义才能使用,因此您需要将定义放在 .bash_profile 中(或您的设置中的任何适当的 shell 初始化文件 - 请参阅here)。

我这样做的方法是将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
}

您在此处需要的逻辑太复杂,无法放入别名(它们比函数更简单和笨拙),但您可以将实际脚本放在单独的文件中并使用别名以避免必须显式 @987654324 @它:

# ...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

【讨论】:

  • @ruakh 我已经对其进行了扩展以澄清这一点,并添加了一个外部文件 + 别名的选项。
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2019-02-08
  • 2021-09-26
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多