I am trying to invoke a shell command with a modified environment via the command env.
According to the manual
env HELLO=\'Hello World\'
It's because in your first case, your current shell expands the $HELLO variable before running the commands. And there's no HELLO variable set in your current shell.
env HELLO='Hello World' echo $HELLO
will do this:
$HELLO'HELLO=Hello World', 'echo' and '' (an empty string, since there's no HELLO variable set in the current shell)env command will run and set the HELLO='Hello World' in its environmentenv will run echo with the argument '' (an empty string)As you see, the current shell expanded the $HELLO variable, which isn't set.
HELLO='Hello World' bash -c 'echo $HELLO'
will do this:
HELLO='Hello World for the following command'-c' and 'echo $HELLO'echo $HELLO$HELLO in the new bash sub-shell, bash first expands anything it can, $HELLO in this case, and the parent shell set that to Hello World for us.echo 'Hello World'If you tried to do e.g. this:
env HELLO='Hello World' echo '$HELLO'
$HELLO is enclosed in single quotes'HELLO=Hello World', 'echo' and '$HELLO'HELLO='Hello World' in its environment'$HELLO'In this case, there's no shell that will expand the $HELLO, so echo receives the string $HELLO and prints out that. Variable expansion is done by shells only.