Git-bash et cygwin shell peuvent-ils faire les mêmes choses?


13

Sous Windows 10, git-bash et cygwin shell peuvent-ils faire les mêmes choses?

Que peut-on faire mais pas l'autre?

Par exemple,

  1. En tant qu'obus, peuvent-ils tous les deux fonctionner de la même manière que bash?
  2. Quels programmes et commandes peuvent s'exécuter dans l'un mais pas dans l'autre?

    Par exemple, dans git-bash, je ne peux pas exécuter de commande 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.
    

    Mais à Cygwin, ça fonctionne bien

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

    à l'origine, je pensais que git-bash et cygwin peuvent tous deux exécuter des programmes sous Windows. Alors pourquoi git-bash ne fonctionne-t-il pas alors que cygwin le peut?

Merci.

Réponses:


10

La différence est que Cygwin sait comment traiter les noms de chemin dits "Win32". En gros, il sait que "\" est un séparateur de chemin et non un caractère d'échappement de shell comme c'est le cas dans Bash. L'erreur que vous avez montrée est que Bash interprète "\" comme un caractère d'échappement. (Modifier: vous pouvez essayer de remplacer un \ par deux, échappant ainsi à la barre oblique inverse, afin que Bash transmette correctement la commande à reg.exe.)

Cela dit, bien que Cygwin utilise des chemins d'accès Windows, il n'aime pas le faire. La documentation vous déconseille de les utiliser. Bien sûr, un petit retour en arrière de temps en temps ne fait pas de mal. Mais bien que vous puissiez exécuter des programmes Windows dans Cygwin, l'hygiène suggère que vous devez exécuter des programmes Windows dans le processeur CMD.EXE et UNIX dans Cygwin pour votre santé mentale à long terme.


1
Vous pouvez utiliser cygpath pour convertir entre les formats de chemin Windows et Unix.
DavidPostill

Merci. Le chemin d'accès dans mes commandes est utilisé comme clé dans la table de registre, donc "\" peut-il être remplacé par "/"?
Tim

Peut-être, mais voyez la suggestion dans la réponse (nouvellement modifiée).
AlwaysLearning

1

Il y a beaucoup de chevauchement entre les deux. Mais finalement, ce sont des implémentations différentes de bash / shall dans Windows.

Cygwin propose un grand nombre de logiciels optionnels que vous pouvez installer, notamment plusieurs langages de programmation différents, des compilateurs, divers outils réseau, etc. Vous pouvez également installer X et de nombreuses applications X.

Avec git bash, vous obtenez ce que vous obtenez, et il est un peu plus difficile d'installer des outils supplémentaires. En fait, j'ai les deux sur mon poste de travail, car il y a des choses que je ne peux pas faire dans git bash. J'ai également eu un succès mitigé en appelant des applications cygwin à partir de la fenêtre git bash.

En outre, cygwin est un environnement posix complet, pas seulement un interpréteur bash, vous pouvez donc souvent compiler du code non distribué, donc par exemple si vous avez trouvé la source d'un bel outil Linux que vous avez trouvé, vous pouvez généralement compiler cet outil pour Cygwin. Pas tant pour git bash. Et comme je l'ai mentionné ci-dessus, même si vous le compilez pour Cygwin, cela ne fonctionnera probablement pas dans git bash.

A part cela, ils sont pour la plupart très similaires. C'est cygpathassez drôle de voir que git bash inclut la commande pour convertir les chemins de fichiers Windows et Posix, car git bash afaik est basé sur MinGW, qui est une solution distincte de Cygwin.


0

Je viens de trouver une différence: je peux exécuter ce script dans Git bash mais pas dans Cygwin.

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

Dans Git bash, il traite mes fichiers xml, mais dans Cygwin, il me donne une erreur:

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

bash --version dans Git bash:

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

à Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)

Cela suggère simplement qu'il n'y a pas de fichier se terminant par .xml dans le répertoire courant, le cas du test cygwin. Vous devez afficher le résultat de lsdans le répertoire courant avec la commande.
Peter - Réintègre Monica le

Je crois que ce n'est pas le cas puisque j'exécute le même script sur deux terminaux en même temps. Le dossier est là.
WesternGun

2
Il y a deux possibilités: (1) Il n'y a pas un tel fichier, peut-être parce que le script cygwin s'exécute dans un répertoire différent. Dans ce cas, le shell laisse le modèle seul (au lieu de le remplacer par la chaîne vide). (Cela ressemble à une erreur presque toujours jusqu'à ce que l'on se findrende compte que l'on peut passer des modèles de cette façon sans guillemets.) (2) Les noms des fichiers sont en fait * .XML (en majuscules) et l'option shell nocaseglobest définie dans la création de shell git insensible à la casse globs (ce qui a un certain sens sous Windows).
Peter - Réintègre Monica le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.