web-dev-qa-db-ja.com

別のシェルで環境変数を変更した場合、他のシェルでも変更または同じままになりますか?

SPORT = baseballなどの環境変数をbashで作成した場合は、tcshに切り替えて、「running」に変更します。 bashに戻すと、SPORTは「実行中」と表示されますか? (私は自分で試してみますが、bashしかありません)

2
Shoulderpadz

これは、あなたが尋ねたことを正確に実行する実際的な実験です。 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つの例外を除いて:新しい環境は親環境から環境変数を継承します。サブシェル(最後の例のように)も、エクスポートされていないシェル変数を継承します。

3
Kusalananda

それは環境変数が意味するものではありません。「環境」はプロセスに固有です。さまざまな事柄に応じて、そのプロセスからフォークされた他のプロセスに継承される場合と継承されない場合があります。実行中のプロセスの環境を変更しても、他の実行中のプロセスに影響を与えることはありません。*

POSIX仕様 の内部で環境変数が何を意味するかを読んでください。 (そして、このドキュメントは実装者を対象としており、ユーザーを対象としていないことを理解してください。)

*または少なくとも、これに対する例外を考案するには、非常に優れた低レベルのコーディングスキルが必要になります。 Cでそれが可能かどうかはわかりません。おそらく共有メモリを使用します。しかし、そのように明示的に設計されていなければ、それは起こりません。

3
Wildcard