Reputation: 1763
I have an automatic setup script that is executed when a new user is created. It runs this line of code to set up the golang environment: echo "export PATH="$PATH:$GOPATH/bin"" >> ~/.profile
But this will expand all environment variables before writing into the file. Is there a way to write export PATH="$PATH:$GOPATH/bin"
into a file from the command line without expanding the environment variables?
Upvotes: 2
Views: 1527
Reputation: 437198
Try:
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.profile
Single-quoted strings in POSIX-like shells (such as bash
) treat their content as literals, which is what you want here.
The only reason to use a double-quoted string here would be to selectively expand variable references up front - which doesn't apply in your case.
That said, here's an example:
$ echo "Honey, I'm \"$USER\" and I'm \$HOME."
Honey, I'm "jdoe" and I'm $HOME.
Backslash-escaping is used to escape embedded "
and $
instances that should be treated as literals.
As for what you tried:
"export PATH="$PATH:$GOPATH/bin""
is actually a string concatentation, composed of 3 separate strings:
"export PATH="
, which, as a double-quoted string that happens not to contains $
-prefixed interpolation elements, expands to literal export PATH=
$PATH:$GOPATH/bin
, which, as an unquoted string, is subject to additional shell expansions, which not only involves expanding variables $PATH
and $GOPATH
to their respective values, but also applies word-splitting and pathname expansion (globbing).""
, which amounts to the empty string and is effectively ignored.Note how POSIX-like shells allow you to compose larger strings (concatenate strings) by placing strings - unquoted or single-quoted or double-quoted - directly next to one another.
Upvotes: 5