您将无法修改调用者的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新闻服务器中也有类似的功能。