SPORT = baseballなどの環境変数をbashで作成した場合は、tcshに切り替えて、「running」に変更します。 bashに戻すと、SPORTは「実行中」と表示されますか? (私は自分で試してみますが、bashしかありません)
これは、あなたが尋ねたことを正確に実行する実際的な実験です。 bash
を実行し、環境変数を設定してから、tcsh
を開始し、その値を変更します。次に、bash
の値をチェックします。
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'
printf 'SPORT is "%s"\n' "$SPORT"
このbash
スクリプトを実行すると、tcsh
が呼び出されます。
SPORT is "baseball"
baseball
archery
SPORT is "baseball"
ただし、これが実際に動作することを確認するためにtcsh
に切り替える必要はありません。bash
スクリプトに(...)
を使用して、別の環境を持つサブシェルを導入するだけで十分です。 :
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
(
echo "$SPORT"
export SPORT=archery
echo "$SPORT"
)
printf 'SPORT is "%s"\n' "$SPORT"
出力は同じままです。
ある環境が別の環境に影響を与えることは不可能です1つの例外を除いて:新しい環境は親環境から環境変数を継承します。サブシェル(最後の例のように)も、エクスポートされていないシェル変数を継承します。
それは環境変数が意味するものではありません。「環境」はプロセスに固有です。さまざまな事柄に応じて、そのプロセスからフォークされた他のプロセスに継承される場合と継承されない場合があります。実行中のプロセスの環境を変更しても、他の実行中のプロセスに影響を与えることはありません。*
POSIX仕様 の内部で環境変数が何を意味するかを読んでください。 (そして、このドキュメントは実装者を対象としており、ユーザーを対象としていないことを理解してください。)
*または少なくとも、これに対する例外を考案するには、非常に優れた低レベルのコーディングスキルが必要になります。 Cでそれが可能かどうかはわかりません。おそらく共有メモリを使用します。しかし、そのように明示的に設計されていなければ、それは起こりません。