17

I am adding an env variable to /etc/environment but because the variable value contains # sign, string is striped.

MYSQL_PWD="something#no"

Now if I do env above code yields MYSQL_PWD=something. How can I escape hash? I've already tried \ character.

  • Are you sure you're posting the exact same thing you're putting in /etc/environment? Because I couldn't duplicate this behavior on Debian Wheezy. – Joseph R. Oct 26 '13 at 22:00
  • Sorry export is not there. Updated my question. – Umair A. Oct 26 '13 at 22:02
  • For now I have changed MySQL pwd :( – Umair A. Oct 26 '13 at 22:12
  • I managed to duplicate your behavior. I didn't realize I needed to log out then back in to get my shell to read /etc/environment. – Joseph R. Oct 26 '13 at 22:14
  • @JosephR. - I duplicated this and was surprised as well. Looking into the role of this file it seems to be consistent with it's intent. – slm Oct 26 '13 at 22:17
17

This doesn't appear to be possible with /etc/environment. It's meant as a common location for variables that's shell independent. Given this it doesn't look like it supports strings with hash marks (#) in them and there doesn't appear to be a way to escape them.

I found this SF Q&A titled: How does one properly escape a leading “#” character in linux etc/environment?. None of these methods worked:

  • control="hello"
  • test0="#hello"
  • test1="h\#ello"
  • test2="h#ello"
  • test3="h//#ello"
  • test4="h/#ello"
  • test5=h#ello
  • test6=h\#ello
  • test7=h#ello
  • test8=h//#ello
  • test9=h/#ello
  • test10='h#ello'
  • test11='h\#ello'
  • test12='h#ello'
  • test13='h//#ello'
  • test14='h/#ello'

The accepted answer to that question and what would also be my advice:

Well it is tricky stuff you want to do /etc/environment is not shell syntax, it looks like one , but it is not, which does frustrates people. The idea behind /etc/environment was wonderful. A shell-independent way to set up variables! Yay! But the practical limitations make it useless.

You can't pass variables in there. Try for example put MAIL=$HOME/Maildir/ into it and see what happens. Best just to stop trying to use it for any purpose whatsoever, alas. So you can't do things with it that you would expect to be able to do if it were processed by a shell.

Use /etc/profile or /etc/bashrc.

Yet still another Q&A gave this rational as to why this is the case:

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.

References

  • is that a bug or there's any reason behind it? – Umair A. Oct 26 '13 at 22:14
  • 1
    @UmairAshraf - not a bug, just limited functionality given the role of this file. This file spans across multiple shell technologies so it has to go with features that are supported in all the shells it will be used in. – slm Oct 26 '13 at 22:15
  • how idiotic; this should just have used the same format as /proc/environ. – Kaz Sep 10 at 0:47
1

Probably too late, but three backslashes before # worked for me.

If the password is, say "admin#123", you can define it as

admin\\\#123
  • This did not work for me in the /etc/environment file. – Joey V. Aug 15 at 15:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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