1

If I execute this in Bash

echo "1 2"

I get 1 2. But if I execute

echo \"1 2\"

I get "1 2".

Now I would figure if I execute

echo $(echo \"1 2\")

I would get 1 2. But again, I get "1 2". In fact, no matter how many command substitutions in the chain

echo $(echo $( ... echo \"1 2\") ... )

I always get "1 2". Why is that?

Benjamin W.
  • 46,058
  • 19
  • 106
  • 116
slicer
  • 13
  • 3

1 Answers1

1

After substituting the output of $(command) back into the command line, the only additional parsing that's done is word-splitting and wildcard expansion. Quotes are not processed, so if the command outputs quotes they will be left in the command line as literal characters.

This is explained in the bash manual section on Quote Removal:

After the preceding expansions, all unquoted occurrences of the characters ‘\’, ‘'’, and ‘"’ that did not result from one of the above expansions are removed.

Since the quotes resulted from command substitution (that's one of the expansions listed before this), they're not removed.

Barmar
  • 741,623
  • 53
  • 500
  • 612
  • Thank you. It seems so. I didn't find the same statement on BASH manual, but I did find this: "If the substitution appears within double quotes, word splitting and file name expansion are not performed on the results." – slicer Feb 05 '15 at 17:27