这是有效的-这不是我要用的,但它“有效”。让我们创建一个脚本teredo来设置环境变量TEREDO_WORMS:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL -i
它将由Korn shell解释,导出环境变量,然后用一个新的交互式shell替换自身。
在运行这个脚本之前,我们将环境中的SHELL设置为C SHELL,并且没有设置环境变量TEREDO_WORMS:
% env | grep SHELL
SHELL=/bin/csh
% env | grep TEREDO
%
当脚本运行时,你在一个新的shell中,另一个交互式C shell,但环境变量是设置的:
% teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
当你退出这个外壳时,原来的外壳接管:
% exit
% env | grep TEREDO
%
在原始shell的环境中没有设置环境变量。如果您使用exec teredo来运行该命令,那么原来的交互式shell将被设置环境的Korn shell所取代,然后依次被一个新的交互式C shell所取代:
% exec teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
如果您键入exit(或Control-D),那么您的shell将退出,可能会让您退出该窗口,或者将您带回到实验开始的前一层shell。
同样的机制也适用于Bash或Korn shell。您可能会发现退出命令之后的提示符出现在有趣的地方。
请注意评论中的讨论。这不是我推荐的解决方案,但它确实实现了单一脚本的目的,即设置与所有shell(接受-i选项以生成交互式shell)一起工作的环境。您还可以在选项后面添加“$@”以中继任何其他参数,这可能会使shell可用作通用的“设置环境和执行命令”工具。如果有其他参数,你可能想要省略-i,导致:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL "${@-'-i'}"
“${@-'-i'}”位表示“如果参数列表包含至少一个参数,则使用原始参数列表;否则,用-i代替不存在的参数'。