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
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.
Answer
- OK, for starters, I think you mean
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 about# echo $$
42
# su joe
% ps --pid 42in which case you're doing the right thing.
What were you expecting?
--pid pidlist
- Select by process ID. Identical to -p and p.
-p pidlist
- Select by PID.
This selects the processes whose process ID numbers appear in pidlist.
Identical to p and --pid.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
.- Your guess is right; environment variables are passed from parent to child.
As indicated above, yoursu
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. - So, no, if you set (export) an environment variable in the shell
in one terminal, and then start another terminal through the window manager,
it will not see the environment variable, because it is not a child
(or descendent) of the shell that set it.
But, if you start a new terminal window from the shell (e.g., byxterm&
),
then that terminal window will inherit the shell's environment.
No comments:
Post a Comment