2017-04-01 11 views
1

私は自分のシェルを作っており、プログラムを実行するためにfork/execをセットアップしています。 '/'のないコマンドでは、PATH環境で実行可能なディレクトリを検索します。しかし、シェルでclearを使うと、TERM環境変数が設定されていないことがわかります。unix "clear" TERM環境変数が設定されていません

execve(args[0], args, environ); 

環境=

char* environ[] = {NULL}; 

が、私はそこに配置する必要があるものがあります:それはこれとは何かを持っている場合、私は疑問に思って? execvpを使用しないことを好むだろう。任意のヘルプが評価されます

+0

はい、それはそれに関係します。 TERMやその他の値を含める環境が必要です。HOME、PATHはすぐに気にしてください。 POSIXの最小値を確認してください。 –

答えて

1

シェルは、独自の環境変数を子プロセスに提供することになっています。実際には、子供を産んだプロセスのほとんどすべてがそうするはずです。通常は、の欠如に注意してください(パラメータとして環境を使用しない場合は、execvを使用します)。

シェルも特別なケースです。シェルは環境を正式に変更して子プロセスに渡すプロセスの1つで、特別なケースです。つまり、おそらくexecveが必要になりますが、ここで固定配列を渡すことはできません。あなたの子供に渡す環境を管理し、シェルの起動時に独自の環境を読み込み、各環境変更コマンド中に変更して、それをenvironとして渡す必要があります。

+0

申し訳ありません私はあまり環境に精通していません。自分の環境を読み込むことはどういう意味ですか?それはgetenvで変数を保存してから、私がプロセスを実行するときに変数を設定します。 – ricefieldboy

+0

@ricefieldboy(ローカルコピーを作成するのではなく)独自の環境を一貫して変更する場合は、多くの場合、ユーザが変数( 'echo $ HOME')を要求したときに' getenv'を呼び出し、変数( 'exportvar = foo')の変更を要求したときに'(un)setenv'を呼び出すだけで十分です。それで 'execv'で十分でしょう。しかし、このアプローチは、シェルローカル変数( 'var = foo')を追加すると動作しません。これらを追加するときは、 'getenv'、' setenv'、 'unsetenv'をあなたのプログラムに複製し、環境変数とシェルローカル変数の両方を検索するように調整する必要があります。 – hvd

関連する問題