¿Pueden git-bash y cygwin shell hacer lo mismo?

13

En Windows 10, ¿pueden git-bash y cygwin shell hacer lo mismo?

¿Qué puede hacer uno pero el otro no?

Por ejemplo,

  1. Como proyectiles, ¿pueden ambos funcionar igual que bash?
  2. ¿Qué programas y comandos pueden ejecutarse en uno pero no en el otro?

    Por ejemplo, en git-bash, no puedo ejecutar algún comando de Windows:

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    ERROR: Invalid syntax.
    Type "REG ADD /?" for usage.
    

    Pero en Cygwin, funciona bien

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    The operation completed successfully.
    

    originalmente pensé que git-bash y cygwin pueden ejecutar programas en Windows. Entonces, ¿por qué no funciona git-bash, mientras que cygwin sí?

Gracias.

Tim
fuente

Respuestas:

10

La diferencia es que Cygwin sabe cómo procesar los llamados nombres de ruta "Win32". Hablando en términos generales, sabe que "\" es un separador de nombre de ruta y no un carácter de escape de shell como en Bash. El error que mostró es que Bash interpreta "\" como un carácter de escape. (Editar: puede intentar reemplazar uno \ con dos, escapando así de la barra invertida, para que Bash pase el comando a reg.exe correctamente).

Dicho esto, mientras Cygwin asimila los nombres de ruta de Windows, no le gusta hacerlo. La documentación le advierte que no los use. Por supuesto, retroceder un poco de vez en cuando no duele. Pero si bien puede ejecutar programas de Windows en Cygwin, la higiene sugiere que debe ejecutar programas de Windows en el procesador CMD.EXE y UNIX en Cygwin para su cordura a largo plazo.

Siempre aprendiendo
fuente
1
Puede usar cygpath para convertir entre ventanas y formatos de ruta unix.
DavidPostill
Gracias. El nombre de ruta en mis comandos se usa como claves en la tabla de registro, por lo que ¿se puede reemplazar "\" en ellos con "/"?
Tim
Quizás, pero vea la sugerencia en la respuesta (recién editada).
Siempre aprendiendo
1

Hay mucha superposición entre los dos. Pero en última instancia, son implementaciones diferentes de bash / should en Windows.

Cygwin tiene una gran cantidad de software opcional que puede instalar, incluidos múltiples lenguajes de programación diferentes, compiladores, diversas herramientas de red, etc. También puede instalar X y muchas aplicaciones X.

Con git bash, obtienes lo que obtienes, y es un poco más difícil instalar herramientas adicionales. De hecho, tengo ambos en mi estación de trabajo, porque hay cosas que no puedo hacer en git bash. También he tenido un éxito muy variado llamando a aplicaciones cygwin desde la ventana de git bash.

Además, cygwin es un entorno posix completo, no solo un intérprete de bash, por lo que a menudo puede compilar código no distribuido dentro de él, por ejemplo, si encuentra la fuente de una buena herramienta de Linux que encontró, generalmente puede compilar esa herramienta para Cygwin No tanto por git bash. Y como mencioné anteriormente, incluso si lo compila para Cygwin probablemente no funcionará en git bash.

Aparte de eso, en su mayoría son muy similares. Es divertido ver que git bash incluye el cygpathcomando para convertir rutas de archivos de Windows y Posix, porque git bash afaik se basa en MinGW, que es una solución distinta de Cygwin.

romulusnr
fuente
0

Acabo de encontrar una diferencia: puedo ejecutar este script en Git bash pero no en Cygwin.

for file in *.xml; do
    echo "Processing file: $file"
    sed -r 's:<Autorizado>([0-9]+)</Autorizado>:<Autorizado>00013069</Autorizado>:' -i "$file"
    # ...
done

En Git bash, procesa mis archivos xml, pero en Cygwin, me da un error:

Processing file: *.xml
sed: cannot read *.xml: No such file or directory

bash --version en Git bash:

GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)

en Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
fuente
Esto simplemente sugiere que no hay ningún archivo que termine en .xml en el directorio actual, como en el caso de la prueba cygwin. Debe mostrar el resultado de lsen el directorio actual con el comando.
Peter - Restablece a Mónica el
Creo que este no es el caso ya que estoy ejecutando el mismo script en dos terminales al mismo tiempo. El archivo está ahí.
WesternGun
2
Hay dos posibilidades: (1) No existe tal archivo, quizás porque el script cygwin se ejecuta en un directorio diferente. En ese caso, el shell deja el patrón solo (en lugar de reemplazarlo con la cadena vacía). (Eso suena como un error casi siempre hasta que uno se da cuenta de que puede pasar patrones de findesa manera sin comillas). (2) Los nombres de los archivos son en realidad * .XML (en mayúsculas) y la opción de shell nocaseglobse establece en la configuración de shell git Globs no distingue entre mayúsculas y minúsculas (lo que tiene cierto sentido en Windows).
Peter - Restablece a Mónica el