From: Brian Inglis <Brian.Inglis@SystematicSw.ab.ca>
To: cygwin@cygwin.com
Subject: Re: Command line processing in dcrt0.cc does not match Microsoft parsing rules
Date: Fri, 30 Aug 2019 20:53:00 -0000 [thread overview]
Message-ID: <4e4e74fe-31b9-9e41-1d09-2a109e27b0b6@SystematicSw.ab.ca> (raw)
In-Reply-To: <MWHPR21MB08452919F35B1B0C5F0EB4DCB9BD0@MWHPR21MB0845.namprd21.prod.outlook.com>
On 2019-08-30 13:16, Stephen Provine via cygwin wrote:
> The standard rules for Microsoft command line processing are documented here:
> https://docs.microsoft.com/en-us/previous-versions/17w5ykft(v=vs.85)
> The Cygwin code for command line processing is in dcrt0.cc, function build_argv.
> The behaviors do not match. For instance, given a test.sh script like this:
> #!/bin/bash
> echo $1
> And the following invocation of bash.exe from a Windows command prompt:
> bash.exe test.sh foo\"bar
> The result is:
> foo\bar
> When the expected result is:
> foo"bar
> As a workaround, you can achieve the expected result using:
> bash.exe test.sh "foo\"bar"
> Which is great until you use a language like Go to shell exec the command line, and don't have control over how the command line string is generated from an original set of arguments. See:
> https://github.com/golang/go/blob/master/src/syscall/exec_windows.go#L86
> Go just reverses the Microsoft standard rules in the most efficient manner possible, but those command lines don't parse correctly in Cygwin processes.
> Go implements a pretty definitive command line parsing algorithm as a replacement for the CommandLineToArgv function in shell32.dll:
> https://github.com/golang/go/commit/39c8d2b7faed06b0e91a1ad7906231f53aab45d1
> The behavior here is based on a detailed analysis of what command line parsing "should" be in Windows:
> http://daviddeley.com/autohotkey/parameters/parameters.htm#WINARGV
> It would be very nice if Cygwin followed the same procedure at startup.
Cygwin command line parsing has to match Unix shell command line processing,
like argument splitting, joining within single or double quotes or after a
backslash escaped white space characters, globbing, and other actions normally
performed by a shell, when any Cygwin program is invoked from any Windows
program e.g. cmd, without those Windows limitations which exclude any use of a
backslash escape character except preceding another or a double quote.
Mixing Cygwin and Windows programs is a user choice requiring them to deal with
any interface issues: just use mintty with bash. ;^> It's actually the same
situation as invoking any another Cygwin program which also does some argument
interpretation, from the shell, possibly requiring nested quoting and escaping.
--
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada
This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
next prev parent reply other threads:[~2019-08-30 20:21 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-30 19:31 Stephen Provine via cygwin
2019-08-30 20:53 ` Brian Inglis [this message]
2019-08-30 21:21 ` Stephen Provine via cygwin
2019-08-31 4:18 ` Brian Inglis
2019-09-03 16:38 ` Stephen Provine via cygwin
2019-09-04 16:20 ` Brian Inglis
2019-09-04 23:46 ` Stephen Provine via cygwin
2019-09-05 5:29 ` Brian Inglis
2019-09-05 18:31 ` Stephen Provine via cygwin
2019-09-05 19:05 ` Eric Blake
2019-09-05 22:01 ` Stephen Provine via cygwin
2019-09-05 22:46 ` Eric Blake
2019-09-05 23:45 ` Stephen Provine via cygwin
2019-09-06 0:46 ` Steven Penny
2019-09-06 1:26 ` Eric Blake
2019-09-06 6:20 ` Stephen Provine via cygwin
2019-09-07 21:50 ` Brian Inglis
2019-09-07 12:05 ` Andrey Repin
2019-09-07 12:20 ` Andrey Repin
2019-09-09 16:47 ` Stephen Provine via cygwin
2019-09-09 16:57 ` Stephen Provine via cygwin
2019-09-09 17:11 ` Eric Blake
2019-09-09 19:05 ` Duncan Roe
2019-09-09 19:44 ` Andrey Repin
2019-09-10 12:43 ` Brian Inglis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4e4e74fe-31b9-9e41-1d09-2a109e27b0b6@SystematicSw.ab.ca \
--to=brian.inglis@systematicsw.ab.ca \
--cc=cygwin@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).