web-dev-qa-db-ja.com

Unixシェル変数の「エクスポート」の範囲は何ですか?

次の方法でいくつかの環境変数を設定しました。

MY_VAR='helloworld'
export MY_VAR

次に、経由で別のユーザーに切り替えました

su SOME_OTHER_USER

MY_VAR変数をエコーし​​ます。その値が表示されます。

1)この問題について説明してください。 exportコマンドを使用して変数をエクスポートする場合、それは「グローバル」エクスポートではなく、ユーザーローカル変数にすぎないことを理解しています。なぜ私はそれを見るのですか?

2)最初は推測していました。別のユーザーに切り替えると、bashプロセスの子プロセスを開始します。そのため、エクスポートされた変数は現在のシェルの子プロセスに渡されるため、変数が表示されます。しかし、コマンドps ---pid <my bash's pid which I got with echo $$>は出力に同じpidのみを表示します。つまり、これは、bashプロセスに関連する子プロセスがなく、suがプロセスを開始していないことを意味しているように見えます。私は正しいですか? (ちなみに、この方法では1つの「子」は表示されません。bashコマンドで別のbashを開始しても、理由はわかりません)

3)最後に、私がその方法でエクスポートした変数を誰が見ることができますか? OS GUIから他のプロセスを開始した場合、それを確認しようとしていますか?別の端末を起動すると、そこに表示されないため、いいえのように見えます。では、エクスポートされた変数のスコープと有効期間はどのくらいですか?

私はDebianWheezyを使用しています。 Rootユーザーの下でRootTerminalからコマンドを実行していました。

5
MiamiBeach
  • わかりました。まず、ps --pidではなくps ---pidを意味していると思います。
  • echo $$してから、ps --pid numberに番号を入力する必要はありません。 ps --pid $$と入力するだけで十分です。あなたが話しているのでなければ

    # echo $$
    42
    # su joe
    % ps --pid 42
    

    その場合、あなたは正しいことをしています。

  • 何を期待していましたか?

    -pidpidlist

      プロセスIDで選択します。と同じ -pそして p


    -ppidlist

      PIDで選択します。これにより、プロセスID番号が表示されるプロセスが選択されます。 pidlist。と同じ pそして --pid

    したがって、ps --pid PID_of_Shellを実行すると、psの出力の行が表示されますシェルプロセスの場合のみps -l | grep PID_of_Shellの方が便利かもしれません。 PPID列を含め、どこにでもPID_of_Shellを含む行が表示されます。つまり、シェルの子プロセスが表示されます。しかし、もちろん、grep 427428のようなものを見つけます。

  • あなたの推測は正しいです。環境変数は親から子に渡されます。上に示したように、suシェルはログインシェル(または他の親シェル)の子です。ただし、プロセスによって環境が変わる可能性があることに注意してください。 Sudoはこれを行うことでやや悪名高いですが、suも同様です(たとえば、$USERを指定しない限り、$LOGNAME$HOME--preserve-environmentを変更し、--loginを指定するとさらに多くのことを変更します)。また、プロセスは、使用している環境とは異なる環境を子に渡すことができます。 PAGER=cat man man_page_topicのようなことを言うと、シェルはそれを行います。参照: 12
  • したがって、いいえ、ある端末のシェルで環境変数を設定(エクスポート)してから、ウィンドウマネージャーを使用して別の端末を起動すると、環境変数はの子(または子孫)ではないため、環境変数は表示されません。それを設定したシェル。ただし、新しいターミナルウィンドウを開始した場合シェルから(たとえば、xterm&によって)、そのターミナルウィンドウはシェルの環境を継承します。
4
Scott

同じユーザーであっても、ssh、rlogin、またはtelnetを使用してマシンにアクセスしていた方が理解しやすい場合があります。 (rlogin/telentは推奨されません)

Tty1からユーザーfooとして変数を設定およびエクスポートすると、すべての子プロセスが変数とその値を確認できます。しかし、まったく新しいセッションを開始した場合、つまり。 tty2から、ユーザーfooとして、変数は表示されません。

1)変数をエクスポートするときは、(セッションコンテキストで)グローバルにします。補足として、「ルート」シェルでの作業の使用は強くお勧めしません。このユーザー/アカウントによって実行された場合、間違いや事故ははるかに寛容ではありません。

2)suコマンドは、セット(またはスイッチ)ユーザーユーティリティです。あなたはまだ元のセッションにいます。これが、エクスポートされた変数を引き続き表示できる理由です。

3)スコープは現在のセッションであり、存続期間はそのセッションの期間です(ログアウトするまで、変数を再度リセットまたは変更しないと仮定します)。親セッションから新しいxtermを生成した場合でも、子にはエクスポートされた変数が表示されます。新しいセッション/ターミナルを開始すると、他のttyからの変数とその値は表示されません。

0
Daniel Liston