Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

On Ubuntu 12.04, I have an environment variable defined in /etc/environment like this:

FOO="value_before#value_after"

When I ssh into the server to check the value, I get this:

$ env | grep FOO
FOO=value_before

I'm guessing it is treating the # as a comment and stripping it out, however, this works:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

I've tried escaping the # like this:

FOO="value_before\#value_after"

But that doesn't work, instead I just get this:

FOO=value_before\

Any ideas on how to make the hash be treated like part of the value? Any help would be great.

Values I've tried in the /etc/environment file:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

And other various combinations of the above. A lot of these will work when you just normally set them in the shell. But they don't seem to work in the /etc/environment file.

share|improve this question
add comment

3 Answers

There is no way in /etc/environment to escape the #(as it treated as a comment) as it is being parsed by he PAM module "pam_env" and it treats it as a simple list of KEY=VAL pairs and sets up the environment accordingly. It is not bash/shell, the parser has no language for doing variable expansion or characters escaping.

share|improve this answer
add comment

I was never able to find a way around this limitation in /etc/environment, the documentation seems to state that /etc/environment is a simple environment file:

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

Which might mean it won't let you escape values using quotes or the \ character, despite other places in the documentation maybe saying this is possible:

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

Or maybe not:

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

Anyway, to get around this limitation, I moved my global environment variables into a file in /etc/profile.d as discussed in this answer. I still consider this question unanswered, but I wanted to make sure there was a linked workaround for posterity.

share|improve this answer
add comment

Single quotes.

$ FOO='foo#bar'
$ echo $FOO
foo#bar
share|improve this answer
    
That was one of the first values I tried, while it works in the shell, sadly, it doesn't work in /etc/environment, I've updated my question with some examples of values I've tried. –  Jaymon Sep 18 '13 at 0:33
add comment

Your Answer

 
discard

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.