提问者:小点点

在Windows Git中的Bash:使用CMD. exe /C参数运行命令时的怪异


这与其说是一个问题,不如说是一个烦恼,但我非常想理解这里的语义学。

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

我的成功率是50/50,因为有些命令按预期工作,而其他命令则没有那么多。

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

我将尝试通过一系列命令和响应来解释我所说的奇怪的含义。(我正在尝试将单词test打印在屏幕上。)

我在GNU bash下运行这些,版本3.1.0(1)-release(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不需要任何参数。

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


共3个答案

匿名用户

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

此外,必须特别小心传递Windows程序的Windows路径,因为它们对MSys样式的POSIX路径一无所知——您可以使用$(cmd//c回显“$POSIXPATH”)之类的东西。

如果您使用cmd//c回显测试,它可以按预期工作。

$ cmd //c echo test
test

原因是试图确保postx路径最终被正确传递给git实用程序。因此,Git for Windows包含一个修改后的MSYS层,它会影响命令参数。您应该注意,Git for Windows提供的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)-release(i686-pc-msys)。

匿名用户

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

我不能完全建立没有任何引号的第一种形式的模式。它似乎适用于Windows ECHO命令,但不适用于其他命令,如DIR。编辑-原来gnu bash在我的命令周围加了引号,所以echtest变成了"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执行的几乎任何命令字符串。