I have set some environment variables in the following way:
MY_VAR='helloworld'
export MY_VAR
Then I have switched to another user via
su SOME_OTHER_USER
I echo the MY_VAR variable.. and I see its value!
1) Could you please explain this issue. As far as I understand when I export variable via export command it is not a "global" export, its just a user-local variable. Why I see it?
2) Initially I had a guess: may be, when I switch to another user I start some child process of my bash process, and thats why I can see my variable because the exported vars are passed to any child process of current shell. But command ps ---pid <my bash's pid which I got with echo $$>
shows only the same pid in output. So looks like this means there are no child processes related to my bash process and su is not starting any process. Am I right?
(by the way, I dont see a single 'child' this way, even if I start another bash with bash command, I dont know why)
3) Finally, who can see the variable I have exported that way? Given I start some other process from my OS GUI – am I about to see it? Looks like no, because if I start another terminal I dont see it there. So what is the scope and lifetime of my exported variable?
I use Debian Wheezy. I was running my command from RootTerminal under Root user.
Best Answer
ps --pid
and notps ---pid
.You don't need to
echo $$
and then type the number intops --pid number
; it's good enough to typeps --pid $$
. Unless you're talking aboutin which case you're doing the right thing.
What were you expecting?
So, when you do
ps --pid PID_of_shell
, you're getting the line ofps
's output for the shell process only. You might findps -l | grep PID_of_shell
more useful; it will show any line that containsPID_of_shell
anywhere, including in the PPID column. I.e., it will show child processes of the shell. But, of course,grep 42
will find things like7428
.su
shell is a child of your login shell (or other parent shell). Note, however, that a process can change its environment;sudo
is somewhat notorious for doing this, andsu
does it too (e.g., it changes$USER
,$LOGNAME
, and$HOME
unless you specify--preserve-environment
, and even more if you do specify--login
). Also, a process can pass its children a different environment than the one it is using; the shell does that when you say something likePAGER=cat man man_page_topic
. References: 1, 2.xterm&
), then that terminal window will inherit the shell's environment.