2

stdinで名前が付けられたすべての環境変数を出力するCプログラムがあります。$ PATH、$ USERなどの変数を出力しますが、Linuxシェルで自分で定義した環境変数は表示されません...たとえば、bashではmy = 4を定義し、プログラムが4を返すことを期待しています。入力に「my」を指定します。

int main  () {
  char * key = (char * )malloc(30);

  scanf("%s", key);

  if(getenv(key) != NULL)
    printf("%s\n", getenv(key));
  else
    printf("NULL\n");

  return 0;
}

getenvの結果を改善するために何ができますか?Linuxシェルからのすべての継承を含むすべての環境変数を表示したいと思います。ありがとうございました..

4

3 に答える 3

6

いくつかの方法があります。

  1. my=4; export my; ./program
  2. my=4 ./program
  3. env my=4 ./program

これらの方法はそれぞれ同じ効果がありますが、メカニズムが異なります。

  1. このメソッドは、使用しているシェルに固有ですが、ほとんどの一般的なシェルではこのように機能します(Bourneシェルのバリアント。cshから派生したシェルも異なります)。これは、最初にシェル変数を設定し、次にそれを環境変数にエクスポートしてから、プログラムを実行します。一部のシェルでは、これを。と省略できますexport my=4。プログラムの実行後も、変数は設定されたままです。

  2. この方法もシェルによって異なります。これにより、この実行のためにmy環境変数が一時的./programに設定されます。実行後、my存在しません(または元の値を持ちます)。

  3. これは、envプログラムを実行する前に、プログラムを使用して環境変数を設定します。この方法は特定のシェルに依存せず、最も移植性があります。方法2と同様に、これは環境変数を一時的に設定します。実際、シェルはそれが設定されていることすら知りませんでしたmy

于 2011-03-23T08:09:30.110 に答える
4

そうしなかっexportた場合、それは単なるシェル変数であり、環境変数ではありません。export my=4またはを使用しmy=4; export myます。

于 2011-03-23T08:08:03.953 に答える
3

これはCまたはとは何の関係もありませんgetenv。シェルで行う場合はmy=4、ローカルシェル変数を定義しています。これを環境変数にするには、を実行しますexport my

于 2011-03-23T08:08:22.433 に答える