Could somebody please tell me what's going on here? First, here is a minimal example:
LINE| 0000| $ echo "$(echo '"' | awk '{sub(/a/,$0)}')" 0001| awk: cmd. line:1: sub(/a/ 0002| awk: cmd. line:1: ^ unexpected newline or end of string 0003| awk: $0) 0004| awk: ^ syntax error 0005| Where is this newline coming from? What happened to the comma? Look what happens if we add the action `NR=1'; notice that the error message seems to show that the `{' has been removed: LINE| 0000| $ echo "$(echo '"' | awk 'NR==1 {sub(/a/,$0)}')" 0001| awk: cmd. line:1: NR==1 sub(/a/ 0002| awk: cmd. line:1: ^ unexpected newline or end of string 0003| awk: NR==1 $0) 0004| awk: ^ syntax error 0005| Interestingly, the whole thing seems to become syntactically correct when I put a space between the `{' and the `sub' (and experimentation shows that it is working): LINE| 0000| $ echo "$(echo '"' | awk 'NR==1 { sub(/a/,$0)}')" 0001| The problem also goes away when I just remove the outer quotes: LINE| 0000| $ echo $(echo '"' | awk 'NR==1 {sub(/a/,$0)}') 0001| However, it should be noted that the outer quotes should not have an effect on any characters within the command substition `$(...)'; consider what the POSIX shell documentation here: http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_02_03 says: Enclosing characters in double-quotes ("") shall preserve the literal value of all characters within the double-quotes, with the exception of the characters dollar sign, backquote, and backslash, as follows: $ The dollar sign shall retain its special meaning introducing parameter expansion (see Parameter Expansion), a form of command substitution (see Command Substitution), and arithmetic expansion (see Arithmetic Expansion). The input characters within the quoted string that are also enclosed between "$(" and the matching ')' shall not be affected by the double-quotes, but rather shall define that command whose output replaces the "$(...)" when the word is expanded. The tokenizing rules in Token Recognition , not including the alias substitutions in Alias Substitution , shall be applied recursively to find the matching ')'. ... ... In particular: The input characters within the quoted string that are also enclosed between "$(" and the matching ')' shall not be affected by the double-quotes, but rather shall define that command whose output replaces the "$(...)" when the word is expanded. >From what I can tell, bash follows the same semantics; the manual here: $ info '(bash)Double Quotes' or here: http://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes says: 3.1.2.3 Double Quotes ..................... Enclosing characters in double quotes (`"') preserves the literal value of all characters within the quotes, with the exception of `$', ``', `\', and, when history expansion is enabled, `!'. The characters `$' and ``' retain their special meaning within double quotes (*note Shell Expansions::). and the manual here: $ info '(bash)Command Substitution' or here: http://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions says: 3.5.4 Command Substitution -------------------------- ... ... When using the `$(COMMAND)' form, all characters between the parentheses make up the command; none are treated specially. ... If the substitution appears within double quotes, word splitting and filename expansion are not performed on the results. Could somebody please tell me what's going on here? Sincerely, Michael Witten