Subject: How do I ... and have that change affect my current shell?
Date: Thu Mar 18 17:16:55 EST 1993

2.8) プログラムやシェルスクリプトの中から、環境変数を操作したりカレントディ レクトリを変更したりして、なおかつそれが現在のシェルに作用するようにす るには、どうすれば良いのですか。

一般には、少なくとも特別な準備をしない限りは、できません。子プロセスが 作られた時、親プロセスの変数のコピー(とカレントディレクトリ)は継承され ます。子プロセスは値を変更しようと思えばいくらでもできるのですが、変更 は親シェルには影響を与えないでしょう。子プロセスは元のデータのコピーを 変更しているからです。

特別な準備というのがあることはあります。もしも親プロセスが出力を読み、 自分の変数をセットするコマンドだと解釈する準備があれば、子プロセスは変 更した変数を書き出すことが可能です。

またシェルは子プロセスの中でと言うより、現在のシェルの中の記述で、他の シェルスクリプトを実行する準備ができます。そうすると変更は元のシェルに 影響します。

例えば、次のような "myscript" というCシェルスクリプトがあるとします。

    
cd /very/long/path
setenv PATH /something:/something-else
もしくは Bourne シェルか Korn シェルならこうなります。

    
cd /very/long/path
PATH=/something:/something-else export PATH
そしてシェルから "myscript" を実行すると、シェルはサブプロセスに分岐し てシェルスクリプトを実行するでしょう。そのサブプロセスはまたシェルを実 行します。シェルが "cd" コマンドを見つけた時、そのシェルのカレントディ レクトリを変更し、"setenv" コマンドを見つけた時はそれ自身の環境変数を 変更します。しかしどちらもあなたがコマンドを打ち込んでいるシェル (login シェルと呼びましょう) には影響しません。

login シェルを分岐させずにスクリプトを実行させるためには、"." コマンド (Bourne シェルや Korn シェル) や "source" コマンド (Cシェル) を使わな ければなりません。つまり Bourne シェルや Korn シェルでは

. myscript
Cシェルでは
source myscript
を実行します。

もしもあなたがやろうとしていることがディレクトリを代わることや環境変数 をセットすることだけなら、Cシェルのエイリアスや Bourne/Korn シェルの関 数を使うことで多分もっと簡単になります。この記事の "プロンプトに現在の ディレクトリ名を出力させておくにはどうすればよいのですか" のいくつかの 例を参照して下さい。

Thomas.Michanek@lin.infolog.se (Thomas Michanek) による、さらに詳細な 解答が、 ftp.wg.omron.co.jp の /pub/unix-faq/docs/script-vs-env にあり ます。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや