これは機能します — 私が使用するものではありませんが、「機能します」。teredo環境変数を設定するスクリプトを作成しましょうTEREDO_WORMS:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL -i
これは Korn シェルによって解釈され、環境変数をエクスポートしてから、それ自体を新しいインタラクティブ シェルに置き換えます。
このスクリプトを実行する前SHELLに、環境を C シェルに設定しましたが、環境変数TEREDO_WORMSは設定されていません。
% env | grep SHELL
SHELL=/bin/csh
% env | grep TEREDO
%
スクリプトを実行すると、別の対話型 C シェルである新しいシェルになりますが、環境変数は設定されています。
% teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
このシェルを終了すると、元のシェルが引き継ぎます:
% exit
% env | grep TEREDO
%
元のシェルの環境では環境変数が設定されていません。を使用exec teredoしてコマンドを実行すると、元の対話型シェルが環境を設定する Korn シェルに置き換えられ、次にそれが新しい対話型 C シェルに置き換えられます。
% exec teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
exit(または) と入力Control-Dすると、シェルが終了し、おそらくそのウィンドウからログアウトするか、実験が開始されたシェルの前のレベルに戻ります。
Bash または Korn シェルでも同じメカニズムが機能します。終了コマンドの後のプロンプトがおかしな場所に表示されることがあります。
コメントの議論に注意してください。-iこれは私が推奨するソリューションではありませんが、すべてのシェル (対話型シェルを作成するオプションを受け入れる) で動作する環境を設定する単一のスクリプトの目的を達成します。"$@"オプションの後に追加して、他の引数を中継することもできます。これにより、シェルを一般的な「環境の設定とコマンドの実行」ツールとして使用できるようになります。-i他の引数がある場合は、次のように省略したい場合があります。
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL "${@-'-i'}"
この"${@-'-i'}"ビットは、「引数リストに少なくとも 1 つの引数が含まれている場合は、元の引数リストを使用する」ことを意味します。-iそれ以外の場合は、存在しない引数を代用します。