別のシェルインスタンスの環境変数を設定することに興味があります。だから私はいくつかの研究を行うことにしました。これについてのいくつかの質問を読んだ後、私はそれをテストすることにしました。
2つのシェルAとB(PID 420)を生成し、どちらもを実行していzsh
ます。シェルAIから以下を実行しました。
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
シェルBから実行するenv
と、変数FOOが実際にbarの値で設定されていることがわかります。これにより、シェルBの環境でFOOが正常に初期化されたと思います。ただし、FOOを印刷しようとすると、設定されていないことを示す空の行が表示されます。私には、ここには矛盾があるように感じます。
これは私自身のArch GNU / LinuxシステムとUbuntu VMの両方でテストされました。またbash
、変数がenvに表示されない場所でもテストしました。これは私には失望しますが、シェルがスポーン時にその環境のコピーをキャッシュし、それだけを使用する場合は理にかなっています(リンクされた質問の1つで提案されていました)。これはまだzsh
変数を見ることができる理由には答えません。
echo $FOO
空の出力はなぜですか?
編集
コメントへの入力後、もう少しテストを行うことにしました。結果は以下の表で確認できます。最初の列は、FOO
変数が注入されたシェルです。最初の行には、その下に出力を表示できるコマンドが含まれています。変数FOO
は次を使用して注入されました:sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'
。zsh:に固有のコマンドzsh -c '...'
もbashを使用してテストされました。結果は同じであり、簡潔にするためにそれらの出力は省略されました。
Arch GNU / Linux、zsh 5.3.1、bash 4.4.12(1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Ubuntu 16.04.2 LTS、zsh 5.1.1、bash 4.3.48(1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
上記は、結果が分布にとらわれないことを意味するようです。これは、はるかに超える私に教えてくれないzsh
とbash
、異なる変数の設定を処理します。さらに、export FOO
シェルに応じて、このコンテキストでは動作が大きく異なります。うまくいけば、これらのテストが他の誰かに何かを明確にすることができるでしょう。
env
)は変更された環境を参照します。
zsh
も、シェル変数として表示されないようですが、子プロセスに渡されます(あなたはのための1つ設定しながら、)を観察してきたbash
んシェル変数としてそれが見えるようにしますがないではない、それは子プロセスに渡すことが原因!zshとbashは変数を管理するために異なる戦略を使用しているようです。zshは非環境変数を追跡し、bashは(非サブシェル)子の起動時にサニタイズする環境内のすべてを保存します。
export FOO
た場合、それは違いを生むのだろうかbash
?
zsh -c 'echo $FOO'
代わりに(単一引用符を使用!)すると、どうなりますか?見えますか?