Oto lista opcji dostępnych od 2018-05 z mnóstwem aktualizacji dotyczących WSL od 2020-01 wraz z odrobiną szczegółów dotyczących każdej z nich.
Opcje, które się wyróżniają
WSL staje się coraz bardziej dojrzały (Microsoft porzucił ostrzeżenie o beta dawno temu) i jest bardzo łatwy do zainstalowania, więc w większości przypadków jest bardzo dobrą (jeśli nie najlepszą) opcją. Rozwiązuje problem za pomocą innej metody niż większość innych opcji. Uruchamiasz dokładnie ten sam kod binarny, który uruchomiłbyś na systemie Linux. Do 2020-01 WSL przechwytuje wywołania jądra i tłumaczy je na wywołania jądra Windows (pomyśl o przeciwieństwie do Wine). To się zmieni, ponieważ obecna beta WSL uruchamia prawdziwe jądro linuksa w lekkiej maszynie wirtualnej.
W każdym razie, z WSL dostajesz ładną powłokę z prawie wszystkimi udogodnieniami CLI, które można znaleźć w instalacji Ubuntu i możliwość apt install
prawie wszystko dostępne z repozytoriów. Microsoft oficjalnie twierdzi, że “WSL nie ma na celu wspierania pulpitów GUI lub aplikacji” jednak istnieją nieoficjalne instrukcje, jak to zrobić. Wydaje się, że w obecnej sytuacji (2020-01) główne wady WSL są następujące:
Oto stare, ale ładne porównanie z cygwin (zauważ, że Rich Turner jest członkiem zespołu WSL i zamieścił wiele przydatnych informacji dotyczących WSL)
Cygwin zapewnia następujące rzeczy:
- powłokę bash i terminal Mintty,
- obszerną gamę popularnych narzędzi linuksowych skompilowanych do działania w Windows
- wszechstronną warstwę kompatybilności, która umożliwia uruchamianie programów linuksowych w Windows.
Cygwin ma na celu ułatwienie przenoszenia aplikacji linuksowych na Windows. Jeśli jakiś program w języku C został zaprojektowany dla Uniksa i oczekuje, że będzie wykorzystywał takie funkcje jak rury, dostęp do plików i katalogów w stylu Uniksa itp., to można go skompilować dla Cygwina, a Cygwin będzie działał jako warstwa kompatybilności pomiędzy kodem a obcym systemem operacyjnym (Windows). Dzięki temu ten sam program w C może działać zarówno w Linuksie jak i Windowsie z niewielkimi lub żadnymi modyfikacjami. W ten sposób powstała ogromna lista programów linuksowych, które można uruchomić po zainstalowaniu Cygwina. Jednak ty, użytkownik tych programów, prawdopodobnie będziesz musiał być zaznajomiony z Uniksem. Na przykład, możesz potrzebować przekazywać argumenty takie jak /cygdrive/c/autoexec.bat
zamiast c:\autoexec.bat
i być przygotowanym na obsługę wyjścia z uniksową terminacją linii (\n
) zamiast terminacji linii Windows (\r\n
).
Zbiór wszystkich programów Cygwin składa się na repozytorium i chociaż Cygwin nie ma tradycyjnego linuksowego menedżera pakietów, możesz dodawać, usuwać i aktualizować programy z tego repozytorium w dowolnym momencie w bardzo sprzeczny z intuicją sposób (uruchamiasz setup. exe w dowolnym momencie po zakończeniu instalacji)
- Babun ** to Cygwin z w pełni funkcjonalnym menedżerem pakietów (pact), oh-my-zsh dla swojej powłoki, git, automatycznymi aktualizacjami i architekturą zorientowaną na wtyczki. Chociaż domyślną powłoką jest zsh, można łatwo przełączyć się na bash. Wydaje się, że jest to miły upgrade z waniliowego Cygwina, jeśli nie przeszkadza ci dodatkowy ciężar.
Mingw-w64 zapewnia następujące możliwości:
- powłokę bash,
- sporą ilość narzędzi linuksowych,
- łańcuch narzędzi programistycznych SW do budowania aplikacji, które będą działać bez warstwy kompatybilności z Linuksem (lub z minimalną).
MinGW jest przede wszystkim dystrybucją oprogramowania i platformą budowlaną dla Windows. W szczególności jest to Windowsowy port narzędzi GNU do kompilacji, takich jak GCC, make, bash, itd. Zawiera sporo narzędzi GNU i minimalną warstwę kompatybilności z Uniksem.
Główna różnica pomiędzy Mingw-w64 a Cygwin polega na priorytetach: Cygwin dąży do zapewnienia kompletnej warstwy kompatybilności POSIX, zawierającej pełną implementację wszystkich głównych wywołań systemowych i bibliotek Uniksa; wydajność jest drugorzędna w stosunku do kompatybilności. Celem MinGW jest wydajność, więc nie będzie on dostarczał pewnych POSIX-owych API, których nie da się łatwo i/lub wystarczająco szybko zaimplementować pod Windows. Również głównym celem MinGW są programiści S/W. Niemniej jednak zwykli użytkownicy mogą również cieszyć się jego powłoką i dołączonymi narzędziami ogólnego przeznaczenia.
MSYS2 zapewnia następujące możliwości:
- powłokę bash i terminal Mintty,
- sporą ilość narzędzi linuksowych,
- w pełni funkcjonalny menedżer pakietów z wierszem poleceń do instalowania programów OS
- części zarówno z Cygwin, jak i MinGW, aby wspierać budowanie aplikacji zarówno z kompleksową warstwą kompatybilności z Linuksem, jak i bez niej.
- repozytorium oprogramowania i menedżer pakietów (pacman), który ułatwia instalowanie, używanie, budowanie i przenoszenie oprogramowania w systemie Windows.
MSYS2 jest również jest przede wszystkim dystrybucją oprogramowania i platformą budowlaną dla Windows jak MinGW, ale łączy w sobie zarówno sposób działania Cygwina jak i MinGW. Możesz używać MSYS2 do tworzenia “programów MinGW” lub “programów MSYS2”. Późniejsze łączą się z warstwą kompatybilności MSYS2 (msys-2.dll), która sama ściśle podąża za rozwojem warstwy kompatybilności Cygwin z kilkoma dodatkami/modyfikacjami . Repozytoria tych dwóch projektów są jednak całkowicie niepowiązane. Więc chociaż zarówno MSYS2 jak i Cygwin dostarczają grep.exe
, mogą mieć zupełnie inną wersję.
- Git dla Windows ** jest albo po prostu MSYS2 z zainstalowanym gitem, albo przynajmniej mocno oparty na MSYS2 . Udostępnia tę samą powłokę (bash), terminal (Mintty) i menedżera pakietów (pacman). Wydaje się, że jest to najpopularniejszy sposób na uzyskanie dominującego Gita działającego na Windowsie, a wraz z nim otrzymujesz miłe środowisko uniksowe.
Common ground
Z wyjątkiem WSL większość z powyższych narzędzi ma wiele wspólnych technologii (biblioteki, pliki wykonywalne, koncepcje). Na przykład powłoka bash dostarczana z MinGW zależy od msys-2.dll, która sama jest rozwidleniem cygwin.dll. Więc tak, jest wiele miejsca na pomyłki :-)
Więcej opcji
Cmder ** zapewnia po prostu ładny terminal i powłokę podobną do bash dla Windows. Jego głównym komponentem jest * Conemu ** (terminal). Na dodatek dodaje Clink, który zapewnia potężną edycję linii poleceń w stylu Bash, niestandardowy układ znaku zachęty i schemat kolorów Monokai. Jest wysoce (a może w pełni) kompatybilny z natywnymi programami konsolowymi Windows.
Scoop ** zapewnia menedżer pakietów w wierszu poleceń dla wielu dobrze znanych programów wieloplatformowych, w tym wielu narzędzi GNU. Pobiera on prekompilowane pakiety. Nie dostarcza ani powłoki ani terminala_, ale zamiast tego działa pod windowsowym cmd.exe (ze wszystkimi jego ograniczeniami, ale także z pełną kompatybilnością z natywnymi windowsowymi programami konsolowymi). Nie zawiera również zestawu kompilatorów (ale oczywiście kompilatory i narzędzia programistyczne są typowymi pakietami, które można zainstalować za pomocą scoopa). Wiele programów, które instaluje Scoop pochodzi bezpośrednio z projektu MinGW/MSYS lub zostało zbudowanych przy użyciu ich narzędzi.
Jeszcze więcej opcji
Poniższe rozwiązania nie wydają się być aktywne i nigdy ich nie testowałem, ale wydaje się, że wykonują swoją pracę dla innych:
Gow ** (Gnu On Windows) jest lekką alternatywą dla Cygwin bez powłoki. Używa wygodnego instalatora Windows, który instaluje około 130 niezwykle użytecznych aplikacji open source dla Linuksa, skompilowanych jako natywne binaria Win32 i dostępnych przez windowsowy cmd.exe. Został zaprojektowany tak, aby był tak mały jak to tylko możliwe (około 10 MB).
UnxUtils & GnuWin32 **: UnxUtils jest zbiorem portów popularnych uniksopodobnych narzędzi GNU do natywnego Win32, z plikami wykonywalnymi zależnymi tylko od Microsoft C-runtime msvcrt.dll. Musisz pobrać część główną i kilka uaktualnień . GnuWin32 ma późniejsze wersje niż UnxUtils, ale wymaga plików pomocniczych (np. DLL)
MSYS & MinGW wydają się mieć być przestarzałe przez MSYS2 & MinGW-W64, więc nigdy na nie nie patrzyłem.
Niektóre wspólne problemy na Cygwin & MSYS2
Odnośnie terminala
Mintty jest terminalem używanym w Cygwin, MSYS2 i ich pochodnych. Należy być świadomym, że jeśli uruchamiasz natywne programy konsolowe, nie jest to bezbolesny zamiennik Windowsowego Wiersza Poleceń. O ile programy z prostym wyjściem tekstowym zazwyczaj działają dobrze, o tyle interaktywne i pełnoekranowe często mają problemy. Przeczytaj więcej na stronie domowej Mintty , a także przeczytaj wpis “Niektóre natywne programy konsolowe nie działają, gdy są uruchamiane z Git Bash” na Git for Windows FAQ . Wpis ten zawiera następujące zalecenia, gdy napotkasz tego typu problemy:
Istnieje kilka metod obejścia tych problemów:
- Uruchamiaj programy, które mają problemy używając narzędzia winpty . Pozwala to na używanie ładniejszego terminala mintty, ale może stać się nieporęczne, jeśli potrzebujesz tego obejścia dla wielu programów.
- [użyj cmd.exe] i skonfiguruj go na “Szybką edycję”, rozsądny rozmiar i przewijanie do tyłu oraz odpowiednią czcionkę unicode. Nadal będziesz musiał żyć z innymi dziwactwami [cmd.exe].
- Zainstaluj i używaj Conemu .
Inne sprawy
Dwie najważniejsze rzeczy, o których należy pamiętać to:
Istnieje kompromis pomiędzy mocą a trudnymi do debugowania problemami. Im potężniejsze rozwiązanie, tym więcej rzeczy może pójść nie tak, nawet w sposób, który początkowo będzie wydawał się niezwiązany z warstwą Linuksa.
Jeśli nie masz dużego doświadczenia z Linuksem, nie używaj potężniejszych rozwiązań, takich jak Cygwin/MSYS2/MinGW
UnxUtils i GnuWin32 mają najmniejszą moc, ale też najmniejszy potencjał powodowania bólu głowy. Cygwin i podobne będą górą zarówno pod względem mocy, jak i bólu głowy. Cmder jest gdzieś pośrodku. Więc Kiedy potrzebujesz najmocniejszych rozwiązań, dobrze się wyśpij i bądź w pełni skoncentrowany. Unikaj używania potężnych rozwiązań podczas testowania czegoś nowego i prawdopodobnie niestabilnego. Nie zapominaj również, że rozwiązania o średniej złożoności takie jak cmder nie są bez skazy.
Problem z komendami linuksowymi podążającymi za komendami windowsowymi jest częstą przyczyną trudnych do debugowania problemów w rozwiązaniach takich jak Cygwin/MSYS2/MinGW. Oto przykład: Miałem plik .bat, który używał polecenia timeout. Po uruchomieniu pod Cygwinem zakończyłby się on niepowodzeniem, ponieważ timeout jest również poleceniem linuksowym, ale o innej składni. Po tym, jak zauważyłem problem, dowiedziałem się, że mogę dodać PATH=… na górze pliku .bat, aby upewnić się, że polecenie windowsowe ma priorytet. Ale wtedy dostałem jeszcze bardziej kryptograficzny “Przekierowanie wejścia nie jest obsługiwane” błąd i zdecydowałem się na obejście zanim znalazłem przyczynę.
Oto przykład problemu z cmderem. Uruchamiałem unison w wersji Windows pod Cmderem i w pewnych szczególnych warunkach zawieszał się z absolutnie żadnym komunikatem o błędzie. To samo polecenie zawsze działało idealnie pod cmd.exe. Zabawne jest to, że działało również doskonale pod Cygwinem (w rzeczywistości, jeśli masz nazwy plików Unicode, terminal Cygwin jest lepszy niż cmd.exe, ponieważ cmd.exe często wyświetla tekst Unicode w sposób zniekształcony).
O tym przewodniku
W latach 2017-05 zachorowałem na niezrozumienie różnic między powyższymi narzędziami, chociaż używałem niektórych z nich od dawna (głównie CygWin i cmder, ale nigdy do celów programistycznych). Więc spędziłem kilka godzin, aby zagłębić się w ten krajobraz. Ten przewodnik jest wynikiem notatek, które prowadziłem. Nie jestem ekspertem w tej dziedzinie, ale bardzo się starałem znaleźć wszystkie istotne informacje, przeczytać je krytycznym okiem i przedstawić najważniejsze części w jasny sposób. Jeśli coś wydaje się nie tak, proszę o komentarz, a postaram się to poprawić.
Na koniec przeprosiny za pewne problemy terminologiczne: W tym tekście czasami używam terminu Linux w miejsce UNIX lub POSIX. Wiem, że to nie to samo, ale bardzo trudno jest je rozróżnić, gdy podchodzi się do tematu z tak dużej odległości. Nawet jeśli nie jest to trudne, zajmuje to czas, którego nie mam ;-)