次の方法でいくつかの環境変数を設定しました。
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からコマンドを実行していました。
ps --pid
ではなくps ---pid
を意味していると思います。echo $$
してから、ps --pid number
に番号を入力する必要はありません。 ps --pid $$
と入力するだけで十分です。あなたが話しているのでなければ
# echo $$
42
# su joe
% ps --pid 42
その場合、あなたは正しいことをしています。
何を期待していましたか?
-pidpidlist
プロセスIDで選択します。と同じ -pそして p。
-ppidlistPIDで選択します。これにより、プロセスID番号が表示されるプロセスが選択されます。 pidlist。と同じ pそして --pid。
したがって、ps --pid PID_of_Shell
を実行すると、ps
の出力の行が表示されますシェルプロセスの場合のみ。 ps -l | grep PID_of_Shell
の方が便利かもしれません。 PPID列を含め、どこにでもPID_of_Shell
を含む行が表示されます。つまり、シェルの子プロセスが表示されます。しかし、もちろん、grep 42
は7428
のようなものを見つけます。
su
シェルはログインシェル(または他の親シェル)の子です。ただし、プロセスによって環境が変わる可能性があることに注意してください。 Sudo
はこれを行うことでやや悪名高いですが、su
も同様です(たとえば、$USER
を指定しない限り、$LOGNAME
、$HOME
、--preserve-environment
を変更し、--login
を指定するとさらに多くのことを変更します)。また、プロセスは、使用している環境とは異なる環境を子に渡すことができます。 PAGER=cat man man_page_topic
のようなことを言うと、シェルはそれを行います。参照: 1 、 2 。xterm&
によって)、そのターミナルウィンドウはシェルの環境を継承します。同じユーザーであっても、ssh、rlogin、またはtelnetを使用してマシンにアクセスしていた方が理解しやすい場合があります。 (rlogin/telentは推奨されません)
Tty1からユーザーfooとして変数を設定およびエクスポートすると、すべての子プロセスが変数とその値を確認できます。しかし、まったく新しいセッションを開始した場合、つまり。 tty2から、ユーザーfooとして、変数は表示されません。
1)変数をエクスポートするときは、(セッションコンテキストで)グローバルにします。補足として、「ルート」シェルでの作業の使用は強くお勧めしません。このユーザー/アカウントによって実行された場合、間違いや事故ははるかに寛容ではありません。
2)suコマンドは、セット(またはスイッチ)ユーザーユーティリティです。あなたはまだ元のセッションにいます。これが、エクスポートされた変数を引き続き表示できる理由です。
3)スコープは現在のセッションであり、存続期間はそのセッションの期間です(ログアウトするまで、変数を再度リセットまたは変更しないと仮定します)。親セッションから新しいxtermを生成した場合でも、子にはエクスポートされた変数が表示されます。新しいセッション/ターミナルを開始すると、他のttyからの変数とその値は表示されません。