unix – 如何将VAR从子shell导出到父shell?

前端之家收集整理的这篇文章主要介绍了unix – 如何将VAR从子shell导出到父shell?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Korn shell脚本
#!/bin/ksh
# set the right ENV
case $INPUT in
abc)
  export BIN=${ABC_BIN}
  ;;
  def)
  export BIN=${DEF_BIN}
  ;;
  *)
  export BIN=${BASE_BIN}
  ;;
esac
# exit 0 <- bad idea for sourcing the file

现在这些VAR仅在子shell中导出,但我希望它们也可以在我的父shell中设置,所以当我在提示时,这些变量仍然正确设置.

我知道

. .myscript.sh

但有没有办法在没有’采购’的情况下做到这一点?
因为我的用户经常忘记’来源’.

编辑1:删除退出0”部分 – 这只是我没有先考虑打字

EDIT2:添加更多细节我为什么需要这个:我的开发人员编写代码(为简单起见)2个应用程序:ABC& DEF.每个应用程序都由独立用户usrabc和usrdef在生产中运行,因此设置了他们的$BIN,$CFG,$ORA_HOME,无论什么 – 特定于他们的应用程序.

所以

> ABC的$BIN = / opt / abc / bin#$ABC_BIN在上面的脚本中
> DEF的$BIN = / opt / def / bin#$DEF_BIN

等等

现在,在开发框中,开发人员可以在他们自己的用户帐户’justin_case’下同时开发ABC和DEF,并且我让它们来源文件(上面),以便他们可以来回切换它们的ENV var设置. ($BIN应该一次指向$ABC_BIN,然后我需要切换到$BIN = $DEF_BIN)

现在,该脚本还应该创建新的沙箱,用于同一个应用程序的并行开发等.这使我以交互方式进行,要求沙箱名称等.

> / home / justin_case / sandBox_abc_beta2
> / home / justin_case / sandBox_abc_r1
> / home / justin_case / sandBox_def_r1

我考虑的另一个选项是编写别名并将它们添加到每个用户配置文件

>别名’setup_env =. .myscript.sh”

并运行它

> setup_env parameter1 … parameterX

这对我来说更有意义

我认为这是一个“不能做”的问题……

首先 – 由于最后的退出0,您不希望获取该脚本.

其次,没有unix子进程可以直接改变父进程的环境.否则各种疯狂的事情都有可能发生.

您可以使用默认配置文件或bashrc文件向其环境添加内容,还是可以为他们尝试运行的任何程序编写包装器?

请允许我详细说明“包装”概念.

假设您希望在环境变量“OPTIONS”中使用PROD或DEV运行程序snoopy,具体取决于您是否需要生产或开发.如果它没有设置,让我们说史努比做的事情就像消灭数据库进行生产和开发一样……

将“snoopy”重命名为snoopy.bin(或.snoopy.bin)

然后将一个脚本放在名为“snoopy”的同一位置,其中包含:

#!/bin/sh

export OPTIONS

case "$OPTIONS" 
in
  PROD) ;;
  DEV) ;;
  *) OPTIONS=DEV ;;
esac

#the binary is actually named snoopy.bin 

exec "$0.bin" "$@"

如果您不想使用实际文件,请将此脚本放在文件系统中的某个位置,该文​​件系统将位于用户PATH中的实际snoopy程序之前,并在脚本的exec语句中具有二进制文件的完整路径…

猜你在找的Bash相关文章