On 2016-04-07, Christian Weisgerber <[email protected]> wrote:

> Let's illustrate the issue:
>
> $ sh          -c 'echo "`echo \"hi\"`"'
> hi
> $ sh -o posix -c 'echo "`echo \"hi\"`"'
> "hi"
>
> I'll just quote ksh.1:
>
>  o   Occurrences of \" inside double quoted `..` command substitutions.
>      In POSIX mode, the \" is interpreted when the command is interpreted;
>      in non-POSIX mode, the backslash is stripped before the command
>      substitution is interpreted.  For example, echo "`echo \"hi\"`"
>      produces ``"hi"'' in POSIX mode, ``hi'' in non-POSIX mode.  To avoid
>      problems, use the $(...) form of command substitution.
>
> From time to time there's a configure script in ports that sets -o
> posix but expects the other behavior, because other popular shells
> do not share this interpretation of what POSIX mandates.  bash,
> whether in POSIX mode or not, and FreeBSD's sh always strip the
> backslashes.
>
> On reading the POSIX text, I find the ksh author's interpretation
> far-fetched.  See also:
> http://austingroupbugs.net/view.php?id=1015
>
> Regardless of what you contend the standard text says, I think it
> is clear that the other interpretation has won out in practice and
> I propose to align our ksh with that:

This has now successfully passed a bulk package build.

> Index: lex.c
>===================================================================
> RCS file: /cvs/src/bin/ksh/lex.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 lex.c
> --- lex.c     4 Mar 2016 09:37:23 -0000       1.68
> +++ lex.c     7 Apr 2016 16:18:13 -0000
> @@ -427,40 +427,22 @@ yylex(int cf)
>                               /* Need to know if we are inside double quotes
>                                * since sh/at&t-ksh translate the \" to " in
>                                * "`..\"..`".
> -                              * This is not done in posix mode (section
> -                              * 3.2.3, Double Quotes: "The backquote shall
> -                              * retain its special meaning introducing the
> -                              * other form of command substitution (see
> -                              * 3.6.3). The portion of the quoted string
> -                              * from the initial backquote and the
> -                              * characters up to the next backquote that
> -                              * is not preceded by a backslash (having
> -                              * escape characters removed) defines that
> -                              * command whose output replaces `...` when
> -                              * the word is expanded."
> -                              * Section 3.6.3, Command Substitution:
> -                              * "Within the backquoted style of command
> -                              * substitution, backslash shall retain its
> -                              * literal meaning, except when followed by
> -                              * $ ` \.").
>                                */
>                               statep->ls_sbquote.indquotes = 0;
> -                             if (!Flag(FPOSIX)) {
> -                                     Lex_state *s = statep;
> -                                     Lex_state *base = state_info.base;
> -                                     while (1) {
> -                                             for (; s != base; s--) {
> -                                                     if (s->ls_state == 
> SDQUOTE) {
> -                                                             
> statep->ls_sbquote.indquotes = 1;
> -                                                             break;
> -                                                     }
> -                                             }
> -                                             if (s != base)
> -                                                     break;
> -                                             if (!(s = s->ls_info.base))
> +                             Lex_state *s = statep;
> +                             Lex_state *base = state_info.base;
> +                             while (1) {
> +                                     for (; s != base; s--) {
> +                                             if (s->ls_state == SDQUOTE) {
> +                                                     
> statep->ls_sbquote.indquotes = 1;
>                                                       break;
> -                                             base = s-- - STATE_BSIZE;
> +                                             }
>                                       }
> +                                     if (s != base)
> +                                             break;
> +                                     if (!(s = s->ls_info.base))
> +                                             break;
> +                                     base = s-- - STATE_BSIZE;
>                               }
>                               break;
>                       default:
> Index: ksh.1
>===================================================================
> RCS file: /cvs/src/bin/ksh/ksh.1,v
> retrieving revision 1.178
> diff -u -p -r1.178 ksh.1
> --- ksh.1     21 Mar 2016 13:35:00 -0000      1.178
> +++ ksh.1     7 Apr 2016 16:10:58 -0000
> @@ -822,12 +822,6 @@ the
>  and the newline are stripped; otherwise, both the
>  .Ql \e
>  and the character following are unchanged.
> -.Pp
> -.Sy Note :
> -See
> -.Sx POSIX mode
> -below for a special rule regarding
> -differences in quoting when the shell is in POSIX mode.
>  .Ss Aliases
>  There are two types of aliases: normal command aliases and tracked aliases.
>  Command aliases are normally used as a short hand for a long or often used
> @@ -2472,27 +2466,6 @@ The following is a list of things that a
>  .Ic posix
>  option:
>  .Bl -bullet
> -.It
> -Occurrences of
> -.Ic \e\&"
> -inside double quoted
> -.Ic `..`
> -command substitutions.
> -In POSIX mode, the
> -.Ic \e\&"
> -is interpreted when the command is interpreted;
> -in non-POSIX mode,
> -the backslash is stripped before the command substitution is interpreted.
> -For example,
> -.Ic echo \&"`echo \e\&"hi\e\&"`\&"
> -produces
> -.Dq \&"hi\&"
> -in POSIX mode,
> -.Dq hi
> -in non-POSIX mode.
> -To avoid problems, use the
> -.Ic $(...)\&
> -form of command substitution.
>  .It
>  .Ic kill -l
>  output.

-- 
Christian "naddy" Weisgerber                          [email protected]

Reply via email to