我的工作场所有几个 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。
在脚本或函数中,您可以执行正确设置环境所需的任何检查。