Czy git-bash i cygwin shell mogą robić to samo?

13

Czy w systemie Windows 10 git-bash i cygwin shell mogą robić to samo?

Co jedno może zrobić, a drugie nie?

Na przykład,

  1. Czy jako powłoki mogą działać tak samo jak bash?
  2. Jakie programy i polecenia mogą działać w jednym, ale nie w drugim?

    Na przykład w git-bash nie mogę uruchomić komendy 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.
    

    Ale w Cygwin działa dobrze

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

    pierwotnie myślałem, że zarówno git-bash, jak i cygwin mogą uruchamiać programy w systemie Windows. Dlaczego więc git-bash nie działa, podczas gdy cygwin może?

Dzięki.

Tim
źródło

Odpowiedzi:

10

Różnica polega na tym, że Cygwin wie, jak przetwarzać tak zwane ścieżki „Win32”. Luźno mówiąc, wie, że „\” jest separatorem nazw ścieżek, a nie znakiem ucieczki powłoki, jak w Bash. Pokazany błąd polega na tym, że Bash interpretuje „\” jako znak zmiany znaczenia. (Edycja: możesz spróbować zastąpić jeden \ dwoma, unikając w ten sposób odwrotnego ukośnika, aby Bash poprawnie przekazał polecenie reg.exe.)

Powiedziawszy to, chociaż Cygwin zna nazwy ścieżek Windows, nie lubi tego robić. Dokumentacja ostrzega cię do korzystania z nich. Oczywiście lekkie przesuwanie się do tyłu od czasu do czasu nie boli. Ale chociaż możesz uruchamiać programy Windows w Cygwin, higiena sugeruje, że powinieneś uruchamiać programy Windows w procesorze CMD.EXE i UNIX w Cygwin, aby zachować zdrowie psychiczne przez długi czas.

AlwaysLearning
źródło
1
Możesz użyć cygpath do konwersji między formatami okien i ścieżek uniksowych.
DavidPostill
Dzięki. Ścieżka w moich poleceniach jest używana jako klucze w tabeli rejestru, więc czy „\” w nich można zastąpić „/”?
Tim
Być może, ale zobacz sugestię w (nowo edytowanej) odpowiedzi.
AlwaysLearning
1

Te dwa elementy nakładają się na siebie. Ale ostatecznie są to różne implementacje bash / will w systemie Windows.

Cygwin ma duży pakiet opcjonalnego oprogramowania, które można zainstalować, w tym wiele różnych języków programowania, kompilatorów, różnych narzędzi sieciowych i tak dalej. Możesz także zainstalować X i wiele aplikacji X.

Dzięki git bash dostajesz to, co dostajesz, a nieco trudniej jest zainstalować dodatkowe narzędzia. Tak naprawdę mam oba na swojej stacji roboczej, ponieważ są rzeczy, których nie mogę zrobić w git bash. Odniosłem bardzo mieszane sukcesy dzwoniąc do aplikacji cygwin z okna git bash.

Ponadto, cygwin to środowisko z pełnym posixem, nie tylko interpreter bash, więc często możesz skompilować w nim nie rozproszony kod, więc na przykład, jeśli znalazłeś źródło miłego narzędzia dla Linuksa, które zwykle znalazłeś, możesz zwykle skompilować to narzędzie dla Cygwin. Nie tyle w przypadku git bash. I jak wspomniałem powyżej, nawet jeśli skompilujesz to dla Cygwina, prawdopodobnie nie zadziała w git bash.

Poza tym są w większości bardzo podobne. Zabawnie jest widzieć, że git bash zawiera cygpathpolecenie do konwersji ścieżek plików Windows i Posix, ponieważ git bash afaik jest oparty na MinGW, co stanowi odrębne rozwiązanie od Cygwin.

romulusnr
źródło
0

Właśnie znalazłem różnicę: mogę uruchomić ten skrypt w Git bash, ale nie w Cygwin.

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

W Git bash przetwarza moje pliki xml, ale w Cygwin daje mi błąd:

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

bash --version w Git bash:

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

w Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
źródło
To po prostu sugeruje, że w bieżącym katalogu nie ma pliku z rozszerzeniem .xml w przypadku testu cygwin. Powinieneś pokazać wynik lsw bieżącym katalogu za pomocą polecenia.
Peter - przywróć Monikę
Wierzę, że tak nie jest, ponieważ uruchamiam ten sam skrypt w dwóch terminalach jednocześnie. Plik jest tam.
WesternGun
2
Istnieją dwie możliwości: (1) Nie ma takiego pliku, być może dlatego, że skrypt cygwin działa w innym katalogu. W takim przypadku powłoka pozostawia wzór w spokoju (zamiast zastępować go pustym łańcuchem). (To brzmi jak prawie zawsze błąd, dopóki nie uświadomimy sobie, że można przesłać wzorce w findten sposób bez cudzysłowu.) (2) Nazwy plików są w rzeczywistości * .XML (wielkimi literami), a opcja powłoki nocaseglobjest ustawiona w procesie tworzenia powłoki git globs nie rozróżnia wielkości liter (co ma pewien sens w systemie Windows).
Peter - Przywróć Monikę