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

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脚本。

是否有任何合理的解决方案不需要在脚本上编写和维护两个版本?


陪伴而非守候
浏览 2040回答 3
3回答

眼眸繁星

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

千巷猫影

您将无法修改调用者的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新闻服务器中也有类似的功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python