这更多的是一个烦恼,而不是一个问题,但我非常想了解这里的语义。
我所要做的就是在临时命令提示会话上运行一个任意命令,该会话本身在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\"