Subject: bug#6784: 24.0.50; cmdproxy incosistency with command pathnames

From: Laimonas Vėbra <[email-masked]>
Date: Wed, 04 Aug 2010 13:28:58 +0300

Eli Zaretskii wrote:

>> Laimonas Vėbra wrote:
>>
>>> <...>
>>
>> Works:
>> cmd.exe /c c:/cygwin/bin/ls | grep foo
>> cmd.exe /c c:/cygwin/bin/ls | C:\cygwin\bin\grep foo
>> cmd.exe /c c:/cygwin/bin/ls | "C:/cygwin/bin/grep" foo
>> cmd.exe /c "c:/cygwin/bin/ls" | "C:/cygwin/bin/grep" foo
>>
>> Fails:
>> cmd.exe /c c:/cygwin/bin/ls | C:/cygwin/bin/grep foo

> In the case in point, the problem was with the executable _before_
> the pipe.

Or with subsequent _slashed_ _and_ _unquoted_ executable(s).
Quote whole command line (with slashed programs/paths single quoted):

M-x shell-command
""c:/cygwin/bin/ls" | grep foo"
M-x shell-command
""c:/cygwin/bin/ls" | "c:/cygwin/bin/grep" foo"

or:

cmdproxy -c """c:/cygwin/bin/ls" | grep o""
cmdproxy -c """c:/cygwin/bin/ls" | "c:/cygwin/bin/grep" o""

and it _works_.

cmd /?:

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:

     1.  If all of the following conditions are met, then quote 
characters on the command line are preserved:

         - no /S switch
         - exactly two quote characters
         - no special characters between the two quote characters,
           where special is one of: &<>()@^|
         - there are one or more whitespace characters between the
           the two quote characters
         - the string between the two quote characters is the name
           of an executable file.

     2.  Otherwise, old behavior is to see if the first character is
         a quote character and if so, strip the leading character and
         remove the last quote character on the command line, preserving
         any text after the last quote character.