问题描述
我想为终端会话的范围设置环境变量。
例如,用户将打开一个终端,输入诸如setproject <project_name>
,并将导出环境变量PROJECT
。
当他们关闭端子时,变量设置将丢失。
该系统令人印象深刻的是,它将知道什么项目名称有效,什么无效。
我在做得很好的地方工作过,我想知道它是如何完成的。
我希望用户不必键入source setproject <project_name>
并且我还想检查他们指定的项目是否有效。
我已经在python中编写了一些东西,它检查项目名称的有效性(针对yaml配置文件),并将其传递给bash脚本,但是它实际上没有用(环境变量未正确设置)。已设置,但仅用于python脚本的范围)
那么,我该怎么做呢? 有什么很好的例子可以说明我在网上寻找什么吗?
1楼
您不能使用普通命令来执行此操作-普通命令(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