repositorio - Bash en Git para Windows: rareza al ejecutar un comando con CMD.exe/C con args
limpiar consola git (5)
Después de leer este artículo, he encontrado una solución que funciona para mí:
$ cat gvim.sh
cmd << EOD
gvim $@
EOD
$
Windows 8.1, Git (versión 1.9.5-preview20141217), GNU bash, versión 3.1.20 (4) -release (i686-pc-msys).
Esto es más una molestia que un problema, pero me gustaría mucho entender la semántica aquí.
Todo lo que quiero hacer es ejecutar un comando arbitrario en una sesión de símbolo del sistema temporal que se ejecuta bajo una sesión de bash.
Mi tasa de éxito es de 50/50, ya que algunos comandos funcionan como se espera y otros no tanto.
Creo que el problema puede estar en torno a los argumentos que no se alinean correctamente (es decir, los argumentos perdidos o combinados)
Trataré de explicar a qué me refiero con extraño mediante una serie de comandos y respuestas. (Estoy tratando de hacer que la palabra prueba se imprima en la pantalla).
Los estoy ejecutando bajo GNU bash, versión 3.1.0 (1) -release (i686-pc-msys) Incluido con Git-1.8.4:
Primer intento:
$ cmd /c echo test
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
c:/>
Segundo intento:
$ cmd ''/c echo test''
test"
Tercer intento:
$ cmd "/c echo test"
test"
Cuarto intento:
$ cmd /c/ echo/ test
test"
Quinto intento:
$ cmd "/c echo" test
''echo" test'' is not recognized as an internal or external command,
operable program or batch file.
¡Apreciaría cualquier sugerencia o información sobre los comportamientos anteriores, ya que esto no es intuitivo para mí y me está volviendo loco!
Edición: hay otra pregunta que parece similar a esta, pero en realidad no lo es, principalmente porque se trata de ejecutar archivos por lotes a través de CMD / C que no requieren ningún argumento.
Realmente no responde a mi pregunta sobre cómo proporcionar argumentos a las aplicaciones de la línea de comandos de Windows, y aunque los ejemplos son sobre CMD / C, la respuesta aquí también se puede aplicar a muchas otras aplicaciones de la línea de comandos de Windows.
Esto está realmente documentado en el archivo ReleaseNotes (en la carpeta de nivel superior de su Git instalado para Windows)
Además, se debe prestar especial atención para pasar las rutas de Windows de los programas de Windows, ya que no tienen ni idea de las rutas POSIX del estilo de MSys. Puede usar algo como $ (cmd // c echo "$ POSIXPATH").
Si usa cmd //c echo test
, funciona como se espera.
$ cmd //c echo test
test
La causa tiene que ver con intentar asegurarse de que las rutas de Posix terminen siendo pasadas correctamente a las utilidades git. Por este motivo, Git para Windows incluye una capa MSYS modificada que afecta los argumentos de los comandos. Debe tener en cuenta que no se pretende que el shell bash y las herramientas provistas con Git para Windows se utilicen como herramientas de Unix de propósito general para Windows. Si desea un conjunto de herramientas de estilo Unix de propósito general, debe instalar MSYS o cygwin. El shell de Git Bash está configurado para trabajar con git y, a veces, eso se nota.
Esto parece funcionar bajo 1.9.5.msysgit.1
!foo=`bar`
cmd //c ////unc-path//with//slashes -args /"Quoted Arguments $foo/"
Noté que git-bash trata el argumento /c
como una unidad C:
C:/Windows/system32/cmd.exe C:/ echo test
Como dbenham encontró dobles comillas se añaden. Esta test"
ecos test"
por ejemplo:
cmd /c/ echo/ test
Necesitaba la misma línea (script) para trabajar en git-bash, así como en Cygwin Bash. Las únicas formas que funcionan son
cmd /c/ echo/ test/&rem/
(tenga en cuenta que esta línea debe terminar en un espacio), y
cmd << EOC
echo test
EOC
Así que evite todos los espacios después de /c
y agregue /&rem/
al final de la línea (incluido el espacio al final), o simplemente envuelva el comando en un documento aquí .
Todo esto probablemente depende de la versión de git-bash y los comandos específicos. :-(
Soy capaz de reproducir principalmente el problema utilizando gnu bash para Windows.
No puedo establecer un patrón con la primera forma sin ninguna cita. Parece funcionar con el comando ECHO de Windows, pero no con otros comandos como DIR. EDITAR - Resulta que gnu bash está poniendo comillas alrededor de mi comando, por lo que echo test
convierte en "echo" "test"
. Las comillas hacen que cmd.exe busque un comando externo en lugar del comando interno de ECHO. Resulta que tengo "echo.exe", así que parece que se ejecuta. Lo extraño es que las citas alrededor de la prueba no se muestran. Cuando intento ejecutar el comando DIR, falla completamente porque no hay ningún DIR.EXE.
Los formularios subsiguientes con comillas (excepto el último), o espacios con escape, funcionan de la misma manera que se ven: hay una comilla al final no deseada en el comando.
No pude encontrar una solución limpia. Sin embargo, tengo un truco feo que debería darte el resultado deseado. Simplemente concatene un comando REM al final de su comando. El REM comentará la cita final no deseada. Es importante que haya un espacio después de REM; de lo contrario, REM"
no se reconocerá como un comando válido. Cualquiera de los siguientes debería funcionar.
$ cmd ''/c echo test&rem ''
$ cmd "/c echo test&rem "
$ cmd /c/ echo/ test/&rem/
Tenga en cuenta que el último comando tiene un espacio después de la barra invertida.
La técnica debería funcionar para casi cualquier cadena de comando que desee ejecutar a través de CMD.EXE.