Bourne | Ash |  #!  | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale

Parameter substitution inside here-document inside command substitution inside double quotes

In most traditional Bourne shells the following reveals a bug which is related to the shell internal quoting mechanism:

  set 123b
  echo "x`cat<<EOF
or more readable:
    set 123b
  echo "x`function`x"

Instead of the expected output


you get one of


depending on whether '\b' is interpreted as Backspace by the echo built-in. (And the example uses echo by intention to remind of this pitfall.)

You cannot try this in shells before SVR1, because they were not fixed about the bug with "`cat<<...`" yet.

In SVR2 shells which are not 8bit-clean, you get

"xx" (inner characters have the 8th bit set),

because the 8th bit was internally used for the quoting mechanism.

This issue was fixed at least on AIX 3, HP-UX 10 and OSF1/V4.

A possible workaround is taking the command substitution out of the double quotes, that is,
  echo "x"`function`"x"