如何将 VAR 从子外壳导出到父外壳?

web*_*sen 15 unix shell environment-variables

我有一个 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
Run Code Online (Sandbox Code Playgroud)

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

我知道

. .myscript.sh
Run Code Online (Sandbox Code Playgroud)

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


EDIT1:删除“exit 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 参数 1 ... 参数 X

这对我来说更有意义了

chr*_*ris 12

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

首先——你不会因为最后的 exit 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" "$@"
Run Code Online (Sandbox Code Playgroud)

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


txw*_*ger 8

答案是采购。Sourcing 允许您在当前shell的脚本中包含变量,但绝不是它的父级。确实,您必须小心不要使用任何退出命令或类似命令,因为这会关闭您当前的 shell。

您可以使用“.”来获取脚本,即

. ./myscript.ksh