O git-bash e o cygwin shell podem fazer as mesmas coisas?

13

No Windows 10, o git-bash e o cygwin shell podem fazer as mesmas coisas?

O que um pode fazer, mas o outro não?

Por exemplo,

  1. Como conchas, os dois podem funcionar da mesma forma que o bash?
  2. Quais programas e comandos podem ser executados em um, mas não no outro?

    Por exemplo, no git-bash, não consigo executar algum comando do 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.
    

    Mas em Cygwin, ele corre bem

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

    originalmente eu pensava que o git-bash e o cygwin podem executar programas no Windows. Então, por que o git-bash não funciona, enquanto o cygwin pode?

Obrigado.

Tim
fonte

Respostas:

10

A diferença é que o Cygwin sabe como processar os chamados nomes de caminho "Win32". Em termos gerais, ele sabe que "\" é um separador de nome de caminho e não um caractere de escape de shell como no Bash. O erro que você mostrou é o Bash interpretando "\" como um caractere de escape. (Edit: você pode tentar substituir um \ por dois, escapando assim à barra invertida, para que o Bash passe o comando para o reg.exe corretamente.)

Dito isto, enquanto Cygwin grok nomes de caminho do Windows, ele não gosta de fazê-lo. A documentação avisa sobre o uso deles. Obviamente, um pequeno deslize para trás de vez em quando não dói. Mas enquanto você pode executar programas Windows no Cygwin, a higiene sugere que você execute programas Windows no processador CMD.EXE e UNIX no Cygwin para sua sanidade a longo prazo.

Sempre aprendendo
fonte
1
Você pode usar o cygpath para converter entre janelas e formatos de caminho unix.
DavidPostill
Obrigado. O nome do caminho em meus comandos é usado como chave na tabela de registro, portanto, "\" neles pode ser substituído por "/"?
Tim
Talvez, mas veja a sugestão na resposta (recém-editada).
AlwaysLearning 25/03
1

Há muita sobreposição entre os dois. Mas, em última análise, são implementações diferentes do bash / will no Windows.

O Cygwin possui um grande corpo de software opcional que você pode instalar, incluindo várias linguagens de programação diferentes, compiladores, várias ferramentas de rede e assim por diante. Você também pode instalar o X e muitos aplicativos X.

Com o git bash, você obtém o que obtém e é um pouco mais difícil instalar ferramentas adicionais. Na verdade, tenho os dois na minha estação de trabalho, porque há coisas que não posso fazer no git bash. Também tive sucesso misto ao chamar aplicativos cygwin a partir da janela do git bash.

Além disso, o cygwin é um ambiente posix completo, não apenas um interpretador do bash; portanto, você pode frequentemente compilar código não distribuído, por exemplo, se você encontrou a fonte de uma boa ferramenta Linux que encontrou, geralmente pode compilar essa ferramenta para Cygwin. Não tanto para o git bash. E como mencionei acima, mesmo se você o compilar para o Cygwin, provavelmente não funcionará no git bash.

Fora isso, eles são muito parecidos. É meio engraçado ver que o git bash inclui o cygpathcomando para converter os caminhos de arquivos do Windows e Posix, porque o git bash afaik é baseado no MinGW, que é uma solução distinta do Cygwin.

romulusnr
fonte
0

Acabei de encontrar uma diferença: posso executar esse script no Git bash, mas não no Cygwin.

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

No Git bash, ele processa meus arquivos xml, mas no Cygwin, gera um erro:

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

bash --version no Git bash:

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

em Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
fonte
Isso apenas sugere que não há arquivo terminando em .xml no diretório atual, no caso do teste cygwin. Você deve mostrar o resultado lsno diretório atual com o comando
Peter - Restabelece Monica
Acredito que não seja esse o caso, pois estou executando o mesmo script em dois terminais ao mesmo tempo. O arquivo está lá.
WesternGun 29/01/19
2
Existem duas possibilidades: (1) Não existe esse arquivo, talvez porque o script cygwin seja executado em um diretório diferente. Nesse caso, o shell deixa o padrão sozinho (em vez de substituí-lo pela string vazia). (Isso parece quase sempre um erro, até que se perceba que é possível passar padrões finddessa maneira sem aspas.) (2) Os nomes dos arquivos são na verdade * .XML (em maiúsculas) e a opção shell nocaseglobé definida na criação de shell git globs insensitive (o que faz certo sentido no Windows).
Peter - Restabelece Monica