Shell Cygwin bash-c根据命令是以c:/开头还是以其他形式开头,生成不同的argc

Shell Cygwin bash-c根据命令是以c:/开头还是以其他形式开头,生成不同的argc,shell,escaping,cygwin,argv,Shell,Escaping,Cygwin,Argv,我在Windows提示符下,即cmd.exe;“camlprog”只打印其参数(即argv),参数之间用“\n”分隔(即每一个参数在其自己的行上) 第一种情况: c:\> c:\cygwin\bin\bash -c "c:/cygwin/home/jonathan/camlprog \"foo\" bar" c:\cygwin\home\jonathan\camlprog.exe foo bar 第二种情况: c:\> c:\cygwin\bin\bash -c "~/camlpr

我在Windows提示符下,即cmd.exe;“camlprog”只打印其参数(即argv),参数之间用“\n”分隔(即每一个参数在其自己的行上)

第一种情况:

c:\> c:\cygwin\bin\bash -c "c:/cygwin/home/jonathan/camlprog \"foo\" bar"
c:\cygwin\home\jonathan\camlprog.exe
foo bar
第二种情况:

c:\> c:\cygwin\bin\bash -c "~/camlprog \"foo\" bar"
c:\cygwin\home\jonathan\camlprog.exe
foo
bar
对我来说,第一种情况绝对是错误的:camlprog被传递为其唯一的参数,而不是两个独立的
foo
bar
参数。我认为这相当于:

c:\> c:\cygwin\bin\bash
jonathan@host:$ c:/.../camlprog "foo" bar
那当然是印刷品

foo
bar
我错过什么了吗?有人知道发生了什么吗

谢谢


jonathan

这可能与bash处理其参数的方式有关。实际上,我们需要查看bash的源代码,以确保真正发生了什么,但是您可以确定这种奇怪行为的原因就在那里

我是根据Windows处理双引号和斜杠的方式得出这个结论的。Windows不像Unix系统那样处理字符串很快,无法在双引号字符串中转义双引号

为了确保这一点,请在Windows上创建一个名为test.bat的文件,其中包含以下内容:

@echo off
echo %1
并通过您的参数调用它:

C:\> test.bat "c:/cygwin/home/jonathan/camlprog \"foo\" bar"
因此,您将获得:

"c:/cygwin/home/jonathan/camlprog \"foo\" bar"
这意味着斜杠和所有其他字符都会传递给脚本。因此,在您的例子中,它们被传递给bash,bash为您处理这些字符,并且它以某种不一致的方式进行处理

因此,要解决您的问题,您可以通过以下方式调用您的命令:

 c:\> c:\cygwin\bin\bash -c 'c:/cygwin/home/jonathan/camlprog "foo" bar'
 foo
 bar

首先使用单引号,然后使用双引号,脚本
camlprog
似乎按预期运行。

如果在完整路径中使用反斜杠,或者使用
/home/jonathan/camlprog.exe
,会怎么样?在第一种情况下,您使用的是DOS ish路径(以驱动器号开始,但使用正斜杠而不是反斜杠),而在第二种情况下,您使用的是Unix风格的路径;我希望我可以使用unix路径,但不幸的是,当前的设置不允许我这样做。谢谢。事实证明,Cygwin的bash进行了一些“嗅探”,试图找出它应该解析命令行Windows样式还是Unix样式。这两个平台有不同的编码约定。解决方案是在“c:/…”前面加上前缀“”,以确保它始终是Unix风格的解析。