Können Git-Bash und Cygwin Shell dasselbe tun?

13

Können Git-Bash und Cygwin-Shell unter Windows 10 dasselbe tun?

Was kann einer tun, der andere nicht?

Zum Beispiel,

  1. Können beide als Muscheln genauso funktionieren wie Bash?
  2. Welche Programme und Befehle können in einem ausgeführt werden, aber nicht in dem anderen?

    In git-bash kann ich beispielsweise keinen Windows-Befehl ausführen:

    $  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.
    

    Aber in Cygwin läuft es gut

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

    ursprünglich dachte ich, dass git-bash und cygwin beide programme unter Windows ausführen können. Warum funktioniert Git-Bash nicht, während Cygwin es kann?

Vielen Dank.

Tim
quelle

Antworten:

10

Der Unterschied besteht darin, dass Cygwin sogenannte "Win32" -Pfadnamen verarbeiten kann. Im Großen und Ganzen weiß es, dass "\" ein Pfadnamen-Trennzeichen ist und kein Shell-Escape-Zeichen wie in Bash. Der Fehler, den Sie angezeigt haben, ist Bash, der "\" als Escape-Zeichen interpretiert. (Bearbeiten: Sie können versuchen, eins \ durch zwei zu ersetzen, um den Backslash zu umgehen, sodass Bash den Befehl korrekt an reg.exe weiterleitet.)

Obwohl Cygwin Windows-Pfadnamen verwendet, mag er dies nicht. Die Dokumentation warnt Sie davor, sie zu verwenden. Natürlich tut ein bisschen Hin und Her nicht weh. Obwohl Sie Windows-Programme in Cygwin ausführen können, empfiehlt Hygiene, Windows-Programme im CMD.EXE-Prozessor und UNIX-Programme in Cygwin auszuführen, um eine langfristige Sicherheit zu gewährleisten.

Immer lernen
quelle
1
Sie können cygpath verwenden , um zwischen Windows- und Unix- Pfadformaten zu konvertieren.
DavidPostill
Vielen Dank. Der Pfadname in meinen Befehlen wird als Schlüssel in der Registrierungstabelle verwendet. Kann also "\" in ihnen durch "/" ersetzt werden?
Tim
Vielleicht, aber siehe den Vorschlag in der (neu bearbeiteten) Antwort.
AlwaysLearning
1

Es gibt viele Überlappungen zwischen den beiden. Letztendlich handelt es sich jedoch um unterschiedliche Implementierungen von bash / should in Windows.

Cygwin verfügt über eine große Auswahl an optionaler Software, die Sie installieren können, einschließlich mehrerer verschiedener Programmiersprachen, Compiler, verschiedener Netzwerkwerkzeuge usw. Sie können auch X und viele X-Anwendungen installieren.

Mit git bash bekommen Sie, was Sie bekommen, und es ist etwas schwieriger, zusätzliche Tools zu installieren. Ich habe tatsächlich beide auf meiner Workstation, weil es Dinge gibt, die ich in Git Bash nicht tun kann. Ich hatte auch sehr gemischte Erfolge beim Aufrufen von Cygwin-Apps aus dem Git-Bash-Fenster.

Außerdem ist cygwin eine vollständige Posix-Umgebung, nicht nur ein Bash-Interpreter, sodass Sie häufig nicht verteilten Code darin kompilieren können. Wenn Sie beispielsweise die Quelle eines netten Linux-Tools gefunden haben, das Sie gefunden haben, können Sie dieses Tool normalerweise für kompilieren Cygwin. Nicht so sehr für Git Bash. Und wie ich oben angedeutet habe, wird es in Git Bash wahrscheinlich nicht funktionieren, selbst wenn Sie es für Cygwin kompilieren.

Davon abgesehen sind sie sich meist sehr ähnlich. Es ist schon komisch zu sehen, dass git bash den cygpathBefehl zum Konvertieren von Windows- und Posix-Dateipfaden enthält, da git bash afaik auf MinGW basiert, einer anderen Lösung als Cygwin.

romulusnr
quelle
0

Ich habe gerade einen Unterschied festgestellt: Ich kann dieses Skript in Git Bash ausführen, aber nicht in Cygwin.

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

In Git Bash verarbeitet es meine XML-Dateien, aber in Cygwin gibt es mir Fehler:

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

bash --version in Git Bash:

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

in Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
quelle
Dies deutet lediglich darauf hin, dass im aktuellen Verzeichnis im Fall des Cygwin-Tests keine Datei mit der Endung .xml vorhanden ist. Sie sollten das Ergebnis von lsim aktuellen Verzeichnis mit dem Befehl anzeigen.
Peter - Stellen Sie Monica am
Ich glaube, dass dies nicht der Fall ist, da ich dasselbe Skript gleichzeitig in zwei Terminals ausführe. Die Datei ist da.
WesternGun
2
Es gibt zwei Möglichkeiten: (1) Es gibt keine solche Datei, möglicherweise weil das Cygwin-Skript in einem anderen Verzeichnis ausgeführt wird. In diesem Fall lässt die Shell das Muster in Ruhe (anstatt es durch die leere Zeichenfolge zu ersetzen). (Das klingt fast immer nach einem Fehler, bis man merkt, dass man Muster ohne findAnführungszeichen auf diese Weise übergeben kann.) (2) Die Dateinamen sind tatsächlich * .XML (in Großbuchstaben) und die Shell-Option nocaseglobwird in der Git-Shell-Erstellung festgelegt Bei Globs wird die Groß- und Kleinschreibung nicht berücksichtigt (was unter Windows einen gewissen Sinn ergibt).
Peter - Reinstate Monica