这行得通——这不是我要使用的,但它“有效”。让我们创建一个脚本teredo
来设置环境变量TEREDO_WORMS
:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL -i
它将由 Korn shell 解释,导出环境变量,然后用新的交互式 shell 替换它自己。
在运行这个脚本之前,我们已经在环境中设置了C shell,并且没有设置SHELL
环境变量:TEREDO_WORMS
% env | grep SHELL
SHELL=/bin/csh
% env | grep TEREDO
%
当脚本运行时,你在一个新的 shell 中,另一个交互式 C shell,但是设置了环境变量:
% teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
当您退出此 shell 时,原始 shell 将接管:
% 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
不存在的参数'。