From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15336 invoked by alias); 5 Sep 2019 05:29:54 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 15326 invoked by uid 89); 5 Sep 2019 05:29:54 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy=inherit, reproduction, Gos, shell32.dll X-HELO: smtp-out-no.shaw.ca Received: from smtp-out-no.shaw.ca (HELO smtp-out-no.shaw.ca) (64.59.134.9) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 05 Sep 2019 05:29:52 +0000 Received: from [192.168.1.114] ([24.64.172.44]) by shaw.ca with ESMTP id 5kL6i0I67sAGk5kL7iBfpc; Wed, 04 Sep 2019 23:29:49 -0600 Reply-To: Brian.Inglis@systematicsw.ab.ca Subject: Re: Command line processing in dcrt0.cc does not match Microsoft parsing rules To: "cygwin@cygwin.com" References: From: Brian Inglis Openpgp: preference=signencrypt Message-ID: <43ba61e8-a3d6-d811-7c86-787da9240a41@SystematicSw.ab.ca> Date: Thu, 05 Sep 2019 05:29:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00035.txt.bz2 On 2019-09-04 17:46, Stephen Provine wrote: > On 2019-09-04 10:20, Brian Inglis wrote: >> and ask if you really expect anyone else to use or reproduce this insanity, >> rather than a sane POSIX parser? > > I know it's insanity, but it's insanity that almost all Windows programs inherit and > implement consistently enough because they use standard libraries or functions > to do the parsing. The Go command line parser used to use CommandLineToArgvW > and only switched away from it due to performance (it's in shell32.dll and that takes > a long time to load). I don't know how accurate their manual reproduction is, but > they seemed to study the sources I sent pretty carefully. > > Anyway, my specific problem is that I have Go code with an array of arguments that > I want to pass verbatim (no glob expansion) to a bash script. I've figured out how to > override Go's default code for building the command line string, but it's not clear how > to correctly construct the command line string. If the POSIX rules are being followed, > I'd expect the following to work: > > bash.exe script.sh arg1 "*" arg3 > > But it always expands the "*" to all the files in the current directory. I've also tried \* and > '*', but same problem. So how do I build a command line string that takes each argument > literally with no processing? As standard on Unix systems, just add another level of quoting for each level of interpretation, as bash will process that command line, then bash will process the script command line. How are you running the command line; I get the same results under cmd or mintty/bash: $ bash -nvx script.sh arg1 "*" arg3 #!/bin/bash # script.sh - echo args argc=$# argv=("$0" "$@") echo argc $argc argv[0] "${argv[0]}" for ((a = 1; a <= $argc; ++a)) do echo argv[$a] "${argv[$a]}" done C:\ > bash script.sh arg1 "*" arg3 argc 3 argv[0] script.sh argv[1] arg1 argv[2] * argv[3] arg3 C:\ > bash -c 'script.sh arg1 "*" arg3' argc 3 argv[0] /mnt/c/Users/bwi/bin/script.sh argv[1] arg1 argv[2] * argv[3] arg3 $ bash script.sh arg1 "*" arg3 argc 3 argv[0] script.sh argv[1] arg1 argv[2] * argv[3] arg3 $ bash -c 'script.sh arg1 "*" arg3' argc 3 argv[0] /home/bwi/bin/script.sh argv[1] arg1 argv[2] * argv[3] arg3 $ cmd /c bash script.sh arg1 "\*" arg3 argc 3 argv[0] script.sh argv[1] arg1 argv[2] * argv[3] arg3 $ cmd /c bash -c 'script.sh arg1 "*" arg3' argc 3 argv[0] /mnt/c/Users/bwi/bin/script.sh argv[1] arg1 argv[2] * argv[3] arg3 but with un-double-quoted (and backslash escaped) * I get a list of the current directory files from all of these commands. Invoking bash with options -vx or set -vx in script.sh will let you see what is happening on stderr. Many errors cause non-interactive shell scripts to exit, so check for child process error return codes (often 128+errno). If you are not careful within script.sh, many unquoted uses of $2 may expand the *. Double quotes allow command and parameter substitution, and history expansion, but suppress pathname expansion. You should refer to each parameter within script.sh as "$1" "$2" "$3", or you might need to quote some or each argument character and enclose the * in double quotes e.g. \""\*"\" to pass thru the Go command line interface. Can you not tell the interface to verbatim passthru the string for execution? You may check any of the POSIX shell, dash/ash/sh shell, ksh Korn shell, or bash shell man pages or docs for more details on variations between shells and extensions to POSIX operation. -- 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