环境变量脚本

环境变量脚本

我的工作场所有几个 centos linux 盒子。

我的任务是为他们创建某种形式的环境变量工具。

这个想法是用户运行该工具,使用他们的项目的参数(可能还有他们的pythonpath“模式”),按回车键,a)"PROJ"创建一个名为的新变量,b)PYTHONPATH附加一个新文件夹。这些变量的作用域仅在终端会话打开时持续有效。

我在其他工作过的地方也看到过这种情况。但我从来没有深入挖掘过它的作用,我现在正在踢自己!

我猜这是一个 bash 脚本,它将变量名称导出到给定的路径。 Python 确实导出环境变量,但它不会保留 - 就像导出仅应用于 python 脚本的子进程一样,因此当脚本结束时,变量也会结束。这就是为什么我得出结论它是一个 bash 脚本。

如果是这样,分发此工具的最佳方法是什么,以便所有盒子都有脚本,最好是别名,这样用户就不会打字source <script_location>.sh

其次,检查参数是否有效的最佳方法是什么?我正在考虑一个 json 文件,其中包含正确的项目代码。

最后,我可以混合使用标记参数和非标记参数吗?例如,用户会键入类似的内容,<tool_name> <project_title> -f其中 -f 是附加的可选功能?我应该将其推广到每个用户的 ~/.bashrc 吗?

如果有任何我正在寻找的例子,我将非常感激能够指出正确的方向......

答案1

您可以创建 sh 文件来定义功能更新了环境。该函数可以命名为“tool_name”。

查看https://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files- 交互式登录 shell 将源代码/etc/profile。检查系统上的该文件,您会发现它会执行诸如获取特定目录中的每个文件之类的操作。在我的基于 ubuntu 的系统上,它是

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

所以,该/etc/profile.d/tool_name.sh文件看起来像

# create the tool function to update the environment
tool_name() {
    # todo: parse options, validate arguments
    export PROJ=$1
    PYTHONPATH+=":$PROJ/bin"
}

用户不需要任何特殊的东西就可以使用它。

我不是告诉你如何将其分发到许多盒子。您需要 sudo 权限或 root 访问权限才能安装到 /etc/profile.d

答案2

环境仅传递给子进程;子进程永远不能直接影响父进程的环境。

要在用户的 shell 中设置变量,需要由 shell 本身设置。一种方法是“获取”设置这些变量的脚本,即该脚本由正在运行的 shell 执行:

$ source scriptname

如果您只是调用脚本:

$ scriptname

然后启动一个新的 shell(即一个新进程),并读取脚本,在其环境中设置变量。然而,一旦该 shell 处理完脚本,它就会退出,从而破坏新创建的环境;因此浪费时间。

或者,您可以通过定义一个 shell 函数/etc/profile来正确设置环境。只有当用户调用该函数时才会完成此操作。这样看起来就像您正在调用某个命令,该命令实际上是一个 shell 函数,因此在同一个 shell 中执行,而不是启动一个新 shell。

在脚本或函数中,您可以执行正确设置环境所需的任何检查。

相关内容