Git for Windows中的Bash:运行带有args的CMD.exe / C命令时出现奇怪

这更多的是一个烦恼,而不是一个问题,但我非常想了解这里的语义。

我所要做的就是在临时命令提示会话上运行一个任意命令,该会话本身在bash会话下运行。

我的成功率是50/50,因为一些命令按预期工作,而另一些则不是那么多。

我认为这个问题可能存在于没有正确排列的论点(即缺失或合并的论点)

我会试着通过一系列命令和回应来解释我的意思。 (我试图让字testing被打印在屏幕上。)

我在GNU bash 3.1.0(1) – 版本(i686-pc-msys)下运行这些版本与Git-1.8.4捆绑在一起:

第一次尝试:

$ cmd /c echo test Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. c:\> 

第二次尝试:

 $ cmd '/c echo test' test" 

第三次尝试:

 $ cmd "/c echo test" test" 

第四次尝试:

 $ cmd /c\ echo\ test test" 

第五次尝试:

 $ cmd "/c echo" test 'echo" test' is not recognized as an internal or external command, operable program or batch file. 

我真的很感谢任何对上述行为的指点或见解,因为这对我来说是不切实际的,并使我疯狂!

编辑:还有一个类似于这个问题的问题 ,但它确实不是,主要是因为它是通过CMD / C运行batch file,不需要任何参数。

它并没有真正回答我如何正确地为Windows命令行应用程序提供参数的问题,即使这些例子是关于CMD / C的,这里的答案也可以应用到其他许多Windows命令行应用程序中。

这实际上记录在ReleaseNotes文件中(在已安装的Git for Windows的顶级文件夹中)

另外,还要额外注意传递Windows程序的Windows路径,因为他们不知道MSYS风格的POSIX路径 – 可以使用类似$(cmd // c echo“$ POSIXPATH”)的东西。

如果您使用cmd //c echo test ,则按预期工作。

 $ cmd //c echo test test 

原因是要确保posix路径最终被正确传递给git实用程序。 因此,Git for Windows包含一个修改的MSYS层,它会影响命令参数。 您应该注意,它并不是打算将Windows Git提供的bash shell和工具用作Windows的通用unix工具。 如果你想要一个通用的unix风格的工具集,那么你应该安装MSYS或cygwin。 Git Bash shell是为使用git而设置的,有时也会显示。

阅读这篇文章后,我找到了适合我的解决方案:

 $ cat gvim.sh cmd << EOD gvim $@ EOD $ 

Windows 8.1,Git(版本1.9.5-preview20141217),GNU bash,版本3.1.20(4) – 发行版(i686-pc-msys)。

我能够主要使用gnu bash for Windows重现问题。

我不能用没有引号的第一种形式来建立一个模式。 它似乎与Windows ECHO命令一起使用,但不能与DIR等其他命令一起使用。 编辑 – 原来gnu bash正在引用我的命令,所以echo test成为"echo" "test" 引号导致cmd.exe查找外部命令而不是内部ECHO命令。 我碰巧有“echo.exe”,所以它似乎运行。 奇怪的是测试周围的报价不显示。 当我尝试运行DIR命令时,它完全失败,因为没有任何DIR.EXE。

后面的引号(除了最后一个)或转义空格的形式与您所看到的相同 – 在命令中有一个不必要的尾部引号。

我不能拿出一个干净的解决方案。 但是,我有一个丑陋的黑客,应该给你想要的结果。 在命令结束处简单地连接REM命令。 REM将注释掉不需要的尾部报价。 REM之后有一个空格是重要的,否则REM"将不被认为是有效的命令,下列任何一个都应该工作。

 $ cmd '/c echo test&rem ' $ cmd "/c echo test&rem " $ cmd /c\ echo\ test\&rem\ 

请注意,最后一个命令在反斜杠之后有一个空格。

该技术应该可以用于任何你想要通过CMD.EXE执行的命令字符串。

我注意到git-bash像C:盘一样对待/c参数:

 C:\Windows\system32\cmd.exe C:/ echo test 

正如dbenham发现双引号添加。 这个回声test"例如:

 cmd /c\ echo\ test 

我需要同样的行(脚本)在git-bash以及Cygwin Bash中工作。 唯一的办法是工作

 cmd /c\ echo\ test\&rem\ 

(注意,这一行需要以空格结束)和

 cmd << EOC echo test EOC 

因此,在/c后面的每一个空格处都可以进行转义,该行的末尾 添加 \&rem\ (包括尾部空格),或者将该命令包装在here文档中 。

所有这一切可能取决于git-bash的版本和特定的命令。 🙁

这似乎在1.9.5.msysgit.1下工作

 !foo=`bar` cmd //c \\\\unc-path\\with\\slashes -args \"Quoted Arguments $foo\"