ユーザーや の呼び出しによって上書きできない環境変数の名前はありますかsetenv
? POSIX1.2008 から理解しているところによると、どのプロセスでも環境ブロックを編集できますが、LANG などの変数の上書きは避ける必要があります。
答え1
環境は、var=value
(慣例により) は、execve() システム コールの3番目の引数として渡されます。
そのリストは、引数リスト( の 2 番目の引数として渡される別の文字列リスト)の場合と同様に、新しいコマンドの実行を開始するときにプロセスのスタックのどこかに配置されますexecve()
。
libc (ほとんど) を使用するプログラムでは、main()
関数が呼び出される前に呼び出される初期化コードにより、それらの環境文字列がenviron
配列として使用できるようになります。
は、プログラムが受信したリスト(のコピー)を変更できる関数と関数libc
も提供します。維持され、変更されたコピーは、libc の/ / / ... 関数(それ自体がシステム コールを呼び出すことになります)を介して、プロセスまたはその子プロセスによって実行される次のコマンドに渡されます。putenv
setenv
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ではマニュアルによると環境変数を読み取り専用にすることはできません。