ラッピングによってC ++で環境変数を操作するための小さな便利な関数を作成しました
std::getenv
、
setenv
そして
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
。最初にこれを試してください:
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
それでも止まります。
関連記事
- ansible:ファイルからローカル環境変数ソースにアクセスする
- 環境変数なしでcondaenvをエクスポートできますか?
- モニターの有無にかかわらずLinuxを実行する
- sh Laravel PHPで使用する環境変数を作成する方法
- PowerShellを使用してファイル内の環境変数で文字列を置換する
- 変数のインポートを行うときに環境変数を使用しないでください
- Chromeデバッガーでのオブジェクト変数へのアクセス(VueJSデバッグ)
- dplyr:単一のmutate(across(…))で新しい変数を作成せずに、変数にシーケンシャル関数を適用します
- 依存関係に変数を持たずにuseEffectで変数を使用するにはどうすればよいですか?
- 割り込みが到着したときにsleep()を終了する方法は?
- プログラムは、最初の桁が大きい変数を表示する必要があります
- -long doubleを使用しているときに、Ofastが誤ったコードを生成する
- 最も近いセットビットと最も遠いセットビットの位置、整数のセットビットの数
- wprintf()を使用して、WinCE6デバイス上のC/C ++でHEXMACアドレスをWCHAR配列に変換します。
- Cでのファイルのロックとロック解除、および同じことをテストするためのシェルスクリプトの記述
- 組み込みシステムのGoogleテスト
- 文字列C ++を「\」で分割します
- externCとマークされた関数からマングルされたクラスインスタンスメソッドを呼び出す
シェルには、内部およびエクスポートされた環境変数の概念があります。
次のようなシェルコマンド
ABC=xyz
内部変数を設定します(これはBashで次を使用して確認できます)set
)。内部変数をエクスポートするには、
export
コマンド。export ABC=xyz
内部変数を作成しますそしてそれをエクスポートします(エクスポートされたものはを使用して見ることができますenv
)。export ABC
それ自体は変数を定義せず、単純なタグですABC
エクスポートする、いつそれは定義されています。たとえば、これを試してください。
そして今と
export
:変数が設定された瞬間にどのようにエクスポートされたかに注目してください。そう
export ABC
純粋にシェル機能であり、環境を変更することはありません。そのためのAPIはありません。空の値で環境変数を設定するには、
export ABC=""
: