为了账号安全,请及时绑定邮箱和手机立即绑定

shell脚本可以设置调用shell的环境变量吗?

shell脚本可以设置调用shell的环境变量吗?

陪伴而非守候 2019-06-29 17:44:21
shell脚本可以设置调用shell的环境变量吗?我正在尝试编写一个shell脚本,在运行时,它将设置一些环境变量,这些变量将留在调用者的shell中。setenv FOO foo在CSH/tcsh中,或export FOO=foo在sh/bash中,只在脚本执行期间设置它。我已经知道了source myscript将运行脚本的命令,而不是启动新的shell,这可能导致设置“调用者的”环境。但问题是:我希望这个脚本可以从bash或csh调用。换句话说,我希望任何一个shell的用户能够运行我的脚本并更改他们的shell环境。因此,“Source”对我不起作用,因为运行CSH的用户无法获取bash脚本,而运行bash的用户无法获取CSH脚本。是否有任何合理的解决方案不需要在脚本上编写和维护两个版本?
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您的shell进程具有父进程环境的副本,并且不访问父进程的任何环境。当shell进程终止时,您对其环境所做的任何更改都将丢失。寻找脚本文件是配置shell环境最常用的方法,您可能只想咬紧牙关,并为这两种shell中的每一种都维护一个。


查看完整回答
反对 回复 2019-06-29
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您将无法修改调用者的shell,因为它位于不同的进程上下文中。当子进程继承shell的变量时,它们将自己继承副本。

您可以做的一件事是编写一个脚本,根据它的调用方式为tcsh或sh发出正确的命令。如果您的脚本是“Setit”,那么请执行:

ln -s setit setit-sh

ln -s setit setit-csh

现在,无论是直接还是在别名中,您都可以从sh执行此操作。

eval `setit-sh`

或者来自CSH的这个

eval `setit-csh`

Setit使用$0来确定其输出样式。

这让人回想起人们是如何获得术语环境变量集的。

这里的优点是,Setit只是用您喜欢的任何shell编写,如下所示:

#!/bin/basharg0=$0
arg0=${arg0##*/}for nv in \
   NAME1=VALUE1 \
   NAME2=VALUE2do
   if [ x$arg0 = xsetit-sh ]; then
      echo 'export '$nv' ;'
   elif [ x$arg0 = xsetit-csh ]; then
      echo 'setenv '${nv%%=*}' '${nv##*=}' ;'
   fidone

有了上面给出的符号链接,再加上回溯的表达式,这就有了所需的结果。

为了简化对CSH、tcsh或类似shell的调用:

alias dosetit 'eval `setit-csh`'

或者是什,bash,等等:

alias dosetit='eval `setit-sh`'

这方面的一个好处是,你只需要在一个地方保持列表。理论上,您甚至可以将列表放入文件中并将cat nvpairfilename在“in”和“do”之间。

这就是过去登录shell终端设置的方式:脚本将输出要在登录shell中执行的状态。别名通常用于简化调用,如“Tset vt 100”中所示。正如在另一个答案中所提到的,InstUsenet新闻服务器中也有类似的功能。


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 2039 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信