ユーザー/呼び出しでオーバーライドできない環境変数名はありますかsetenv
? POSIX1.2008で私が知っている限り、すべてのプロセスは環境ブロックを編集できますが、LANGなどの変数を上書きすることを避ける必要があります。
答え1
環境は、次の形式の文字列のリストですvar=value
(慣例によると)はexecve()システムコールの3番目の引数として渡されます。
execve()
プロセスが新しいコマンドの実行を開始すると、このリストは引数リスト(2番目の引数として渡される別の文字列リスト)と同様に、プロセススタックのどこかに配置されます。
libc(ほとんど)を使用するプログラムでは、これらのmain()
環境文字列を配列として使用できるように関数を呼び出す前に初期化コードが呼び出されますenviron
。
また、libc
プログラムが受信したリスト(コピー)を変更する機能も提供しますputenv
。保持され変更されたコピーは、setenv
libcの/ / / ...関数(最後にシステムコールを呼び出す)を介してプロセスまたはその子孫によって実行される次のコマンドに渡されます。execvp()
execl()
system()
popen()
execve()
これで、システムコールに手動で渡される文字列のリストを作成するとき(文字なし)や(空の変数名を使用)などのexecve()
文字列を渡すことができますが、それはできません(拒否)。foo
=
=bar
setenv
setenv("", "bar", 1)
setenv("a=b", "c")
拒否にもなります。したがって、で定義された文字列は常に空にすることはできませんsetenv
。x=y
x
これが唯一の限界です(またによるputenv
)。これはNULで終わる文字列であり、もちろんNUL文字は変数名または値には現れません。
setenv("*", "x", 1)
、またはカーネルに関する限りsetenv("\n\n", "", 1)
。setenv()
今、これで役に立つことができるかどうかは別の話です。
答え2
いいえ。プロセスが変更できる環境変数に制限はありません。ただし、各プロセスには独自の特性があることに注意してください。自分のコピー環境は継承され、プロセスは他のプロセスの環境変数を変更できません。このsetenv
呼び出しは、呼び出しプロセス内の環境のみを変更できます。
答え3
export MYENV=value
readonly MYENV
答え4
私はそれがすべて実行しているシェルに依存していると思います。
マニュアルページによると、BashではUID
1つは別のものです。BASH_VERSINFO
一方、マニュアルによると、cshでは環境変数は読み取り専用に設定できません。