Question Utiliser l'exécutable cygwin dans le script git bash


j'ai un .sh script que je double-cliquez pour le faire exécuter par git pour Windows.

Maintenant j'ai besoin (imagemagick) convert de cygwin (que j'ai installé) et je l'appelle avec son chemin absolu - /c/cygwin64/bin/convert.exe - mais je reçois:

erreur fatale - non-concordance de la base cygheap détectée.   Ce problème est probablement dû à l'utilisation de versions incompatibles de la DLL cygwin.

Envelopper le réel convert appeler un appel cygwin bash, ou même dans un cmd.exe appel, n'aide pas. C'est un peu étrange car j'utilise parfois des exécutables cygwin directement dans .cmd scripts, et cela a toujours fonctionné.

Que puis-je faire? Une solution qui limite mon programme à un seul fichier serait préférable.

(Je sais que je pourrais probablement installer imagemagick natif à Windows. Mais le lendemain, j'ai besoin d'un autre outil cygwin dans un git-for-Win-Shellscript .. aussi, j'aimerais comprendre ce qui se passe ici. Et, oui, Je vais probablement faire git pour Windows obsolète sur mon lieu de travail, si possible)


5
2018-02-12 09:52


origine


Ne mélangez pas les différents produits basés sur Cygwin. Utilisez Cygwin git à la place. - DavidPostill♦
Merci pour votre commentaire. Il n'était pas évident pour moi que git pour Windows soit basé sur cygwin. Je lis continuellement "MinGW" .. "MSYS" etc. qui ne ressemble pas tellement à cygwin. Mais juste par curiosité: quels autres produits sont basés sur cygwin? - SomeDev
Et ai-je raison de dire que les outils UnxUtils / GnuWin32 sont Windows? Est-il vrai que Microsoft travaille sur une sorte d'environnement similaire à Linux dans Windows (y compris un bash et peut-être d'autres bonnes choses)? - SomeDev
"Il n'était pas évident pour moi que git pour Windows soit basé sur cygwin" Je suppose que c'est basé sur le message d'erreur dll. Pouvez-vous vérifier si vous avez plusieurs copies de la DLL cygwin sur votre système? - DavidPostill♦
Windows 10 Anniversary Edition a introduit une nouvelle fonctionnalité appelée Windows Subsystem for Linux. Il comprend bash. Je n'exécute pas Windows 10, donc je ne sais pas ce que cela inclut d'autre. - DavidPostill♦


Réponses:


erreur fatale - non-concordance de la base cygheap détectée.

Ce problème est probablement dû à l'utilisation de versions incompatibles de la DLL cygwin.

Cette erreur est due au fait que le chemin Git for Windows est incompatible avec Cywin.

  • Ils utilisent tous les deux /bin et /usr/bin mais ces cartes à différents répertoires (car ils utilisent des tables de montage différentes).

  • Cywin s'attend à trouver le dll dans /usr/bin/cygwin1.dll (et ne se trouve pas dans Git pour Windows)

  • Lorsque vous exécutez explicitement tout Commande Cygwin dans un Git pour Windows bash shell Cygwin ne peut pas trouver sa DLL et génère le message d'erreur ci-dessus.

  • Notez ci-dessous que le mappage de montage pour / est différent.

Git pour Windows:

DavidPostill@Hal MINGW64 ~
$ mount
C:/temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C:/apps/Git on / type ntfs (binary,noacl,auto)
C:/apps/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type vfat (binary,noacl,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,noacl,posix=0,user,noumount,auto)

DavidPostill@Hal MINGW64 ~
$ which cygwin1.dll
which: no cygwin1.dll in (/c/Users/DavidPostill/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/DavidPostill/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/apps/WSCC/Sysinternals Suite:/c/apps/WSCC/NirSoft Utilities:/c/apps/Calibre:/cmd:/mingw64/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl)

DavidPostill@Hal MINGW64 ~
$ /c/cygwin/bin/man
      1 [main] man (608) C:\cygwin\bin\man.exe: *** fatal error - cygheap base mismatch detected - 0x180301408/0x180304408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.
Segmentation fault

Cygwin:

$ mount
C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
C:/cygwin on / type ntfs (binary,auto)
C: on /c type ntfs (binary,posix=0,user,noumount,auto)
E: on /e type vfat (binary,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,posix=0,user,noumount,auto)
$ which cygwin1.dll
/usr/bin/cygwin1.dll
$ /c/cygwin/bin/man
What manual page do you want?

1
2018-02-12 18:36



Merci pour l'explication. Que diriez-vous d'une solution? - Jim G.
@JimG. Il n'y en a pas un autre que de ne pas mélanger et faire correspondre les utilitaires dérivés de cygwin. Choisissez en un et gardez le. - DavidPostill♦