Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

google is giving no love on this one today, so I turn to the experts...

I'm currently hacking together a script that relies on the /proc/pid/environ feature in Linux (RHEL 4) to check for a particular environment variable. Trouble is, it seems certain environment variables aren't showing up in there for some reason.


create some test vars:
$ export T_1=testval TEST_1=testval T=testval TESTING_LONGEST=testval

open a subshell:

$ cat /proc/self/environ|tr "\0" "\n"|grep testval

hmm... where did T_1 and TEST_1 go?? what rules govern this strange universe?

Thanks in advance, Josh


I have been able to reproduce this issue on various RHEL versions and with various users, but it seems it is unique to Bash (I'm using 3.0). ksh does not show this behavior.

share|improve this question
It seems to work fine on my system. Before you launch your sub-shell run the command export | grep testval and make sure everything really exists. – Zoredache Apr 16 '10 at 16:32
They are there. Perhaps we're looking at an issue with a particular RHEL release. – Josh Arenberg Apr 16 '10 at 16:44
Try a different approach and see if it gives you the same results: grep -z testval /proc/self/environ | xargs -I{} -0 printf \{\}"\n" or set | grep testval – Dennis Williamson Apr 16 '10 at 17:41
Dennis, your first test produces the same result, but the second test shows them, as does 'env|grep testval'. So they are making it into the shell, but not into /proc/pid/environ. – Josh Arenberg Apr 16 '10 at 17:47
Works as expected on my system(s). Bash 3.2, 2.6.24 kernel, Ubuntu 8.04. – Insyte Apr 16 '10 at 19:02
up vote 1 down vote accepted

Have a look at ; it notes that /proc/*/environ is limited to 4096 bytes on some kernels, and that it doesn't display env vars that were changed in that shell.

share|improve this answer

Try using strings instead of tr. It's much better at finding readable strings than just replacing NULs with newlines.

strings /proc/$$/environ
share|improve this answer
That is not a good idea. The format of the environ pseudo-file is easy to understand, and replacing all NUL characters with newlines is the way to turn it into readable text. – kasperd Dec 27 '15 at 12:00

Some files in /proc don't respond well to being read in small blocks. Try something like this instead:

dd if=/proc/self/environ bs=1024k | tr "\0" "\n" | grep testval
share|improve this answer
That will read the data in even smaller blocks than cat. – kasperd Dec 27 '15 at 11:56

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.