bugfix> c++ > 投稿

ラッピングによってC ++で環境変数を操作するための小さな便利な関数を作成しました std::getenvsetenv そして environ 。環境変数の設定と取得に加えて、現在の環境に特定の変数が含まれているかどうかを確認する機能を提供しました。

#include <cstdlib>
#include <unistd.h>
template <typename VAR_TYPE>
void set(const std::string& variableName, VAR_TYPE varValue, bool overwrite = false) {
    if (!setenv(variableName.c_str(), std::string(variableValue).c_str(), overwrite)) {
      if (errno == ENOMEM) {
        throw std::bad_alloc();
      } else if (errno == EINVAL) {
        throw std::invalid_argument("Variable name invalid: "  + variableName);
      } else {
        throw std::runtime_error("Failed to set environment variable " + variableName);
      }
    }
  }
std::string load(const std::string& variableName, const std::string& defaultValue = "") {
    if (const char* envVariable = std::getenv(variableName)) {
      return std::string(envVariable);
    }
    return defaultValue;
  }
bool contains(const std::string& variableName) {
    for (char** currentEnviron = environ; *currentEnviron; currentEnviron++) {
      if (!std::strncmp(variableName.c_str(), *currentEnviron, variableName.length())) {
        return true;
      }
    }
    return false;
  }

しかしながら、定義により、これにより、次の形式の環境変数にのみアクセスできます。 NAME=VALUE

bash 、私は次のことができます:

$> export SOME_VAR
$> export -p | grep SOME_VAR
declare -x SOME_VAR

どうやら、 SOME_VAR 値を割り当てなくても、どこかで定義されています。走ると printenv ただし、これはラッパーで使用するのと同じメソッドを使用します。 SOME_VAR 記載されていません。私は見てきました /proc/self/environ ただし、これは割り当てられた値を持つ変数のみをリストします。

私の質問は次のとおりです。

  • 次のように定義された環境変数の違いは何ですか SOME_VAR_WITH_VALUE=42 そして SOME_VAR_WITHOUT_VALUE
  • C/C ++で値なしで環境変数にアクセスする可能性はありますか?
  • 回答 3 件
    • シェルには、内部およびエクスポートされた環境変数の概念があります。

      次のようなシェルコマンド ABC=xyz 内部変数を設定します(これはBashで次を使用して確認できます) set )。

      内部変数をエクスポートするには、 export コマンド。

      export ABC=xyz 内部変数を作成しますそしてそれをエクスポートします(エクスポートされたものはを使用して見ることができます env )。

      export ABC それ自体は変数を定義せず、単純なタグです ABC エクスポートする、いつそれは定義されています。

      たとえば、これを試してください。

      $ ABC=xyz
      $ set | grep ABC
      ABC=xyz
      $ env | grep ABC
      
      

      そして今と export

      $ export ABC
      $ set | grep ABC
      $ env | grep ABC
      $ ABC=xyz
      $ set | grep ABC
      ABC=xyz
      $ env | grep ABC
      ABC=xyz
      
      

      変数が設定された瞬間にどのようにエクスポートされたかに注目してください。そう export ABC 純粋にシェル機能であり、環境を変更することはありません。そのためのAPIはありません。

      空の値で環境変数を設定するには、 export ABC=""

      $ export ABC=""
      $ env | grep ABC
      ABC=
      
      

    • 最初にこれを試してください:

      export SOME_VAR
      set | grep SOME_VAR
      
      

      2行目は何も返しません。これは、最初の行で定義されていないためです SOME_VAR

      あなたの2つの質問について:

      export VARIABLE 効果はありません。値のない変数を作成したり、すでに設定されている変数の値を変更したりすることはありません。

      環境変数には常に値がありますが、その値は空の文字列である可能性があります。存在しない変数にアクセスしようとすると、次のようになります。 NULL

    • 最終的には、 bash は単なる別のLinuxプログラムです。関係する魔法は限られています。それは変更することができます libc environ 変数ですが、独自の内部変数を持つこともできます。見えない場合 SOME_VAR_WITHOUT_VALUE/proc/sef/environ 、それはある種のbash内部変数であると推測できます。

      ご了承ください bash 、ほとんどのLinuxプログラムと同様に、複数回並行して実行できます。環境はプロセス間で分離されています。したがって、Cでも、bash環境変数にアクセスすることはできません。直接。プロセスの開始時に、bashがその環境を環境にコピーするという事実を利用しています。だが env -i your_process それでも止まります。

    あなたの答え