Zaktualizuj podsumowanie
Pliki wykonywalne, o których mowa, nie mają macierzystego formatu linuksowego (ELF), są kompilowane dla systemu Windows. Podczas ekspansji ścieżki, bash sprawdza magiczną liczbę plików binarnych, jeśli nie pasuje do ELF, nie ujawnia jej poprzez ekspansję ścieżki. Jednak bash dla Windows miał możliwość uruchamiania natywnych aplikacji Windows ze środowiska bash, dlatego bezpośrednie wykonanie (bez rozwijania ścieżki i późniejszego sprawdzania binarnego) działa dobrze.
Rozdzielczość jest albo dodatkiem .bashrc opartym na aliasie (lub dowolną liczbą alternatywnych metod naśladowania rozszerzenia ścieżki, omijając w ten sposób ocenę pliku bash) lub instalacją wersji linux.
Oryginalna odpowiedź
Uprawnienia do plików
Prawdopodobnie jest to problem z uprawnieniami w systemie plików. Jeśli ty cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
i spróbujesz uruchomić mvn tak, ./mvn
co się stanie?
Jakie są dane wyjściowe ls -alt
w tym katalogu?
Jeśli plik nie jest poprawnie oznaczony jako wykonywalny, nie pojawi się jako „program” na twojej ścieżce. Jeśli jest to plik binarny, a nie w formacie „linux” (ELF), nie będzie również wyświetlany jako plik wykonywalny ścieżki.
Jeśli bezpośrednie wykonanie mvn nie działa (proszę opublikować wyniki ls), spróbuj dodać uprawnienia do wykonywania chmod ug+x mvn
Zainstalowano niewłaściwą wersję
Jesteś pewien, że masz zainstalowaną natywną wersję Linuksa - ta sama wersja, której użyłeś z cygwin prawie na pewno nie zadziała.
Możesz sprawdzić zgodność binarną z
sudo apt-get install elf-binutils
tym plikiem mvn, używając polecenia
readelf -a mvn
Jeśli pojawi się błąd, taki jak „Nie plik ELF ...”, to masz odpowiedź.
Właśnie zauważyłem, że w swoim przykładzie nie dodałeś uprawnień do wykonywania skryptu powłoki testowej, co (chyba że po prostu zapomniałeś podać krok), całkowicie wyjaśnia tę konkretną awarię.
Podsumowanie:
- Upewnij się, że pliki wykonywalne w katalogu bin maven są poprawnie ustawione jako pliki wykonywalne za pomocą chmod. Opublikuj wynik ls -alt w swojej odpowiedzi.
- Upewnij się, że masz plik binarny z linuksem - użyj do sprawdzenia usety readelf.
- Ponownie uruchom test skryptu powłoki, ale tym razem zaznacz plik wykonywalny.
Aktualizacja
Problem ze ścieżką to czerwony śledź; po prostu próbujesz uruchomić format binarny, który nie jest zgodny z linuksem w środowisku Windows.
Na pierwszy rzut oka dwa środowiska (cygwin i bash w systemie Windows) zapewniają nieco podobne wrażenia użytkownika, ale implementacja i wynikowa zgodność binarna są bardzo różne.
Konkluzja - Formaty binarne Cygwin i Linux nie są kompatybilne. Musisz zainstalować natywną wersję Linuksa, aby uruchomić ją z bash na Windowsie. Możesz również skompilować go ze źródła w środowisku bash w środowisku Windows; ale z powodu „wczesnych dni” środowiska, martwiłbym się ściganiem zależności.
Krótki opis dwóch środowisk:
Cygwin jest w rzeczywistości warstwą tłumaczącą, która zapewnia interfejs API dla wywołań systemowych, które zwykle nie są dostępne w systemach innych niż POSIX, co pozwala na kompilację wielu programów napisanych do działania na systemie Linux w środowisku Windows. Jednak nadal działa w środowisku Windows - ten plik binarny będzie teraz działał tylko w środowisku cygwin w systemie Windows. Ta warstwa translacji i powiązane biblioteki pozwalają na kompilację kodu źródłowego napisanego na interfejsie API systemu Linux w środowisku cygwin i uruchomienie go w systemie Windows. Pliki binarne zbudowane w ten sposób nie będą działały natywnie w systemie Linux lub Windows; tylko w środowisku cygwin.
Środowisko bash w systemie Windows dostarczane przez canonical różni się znacznie od cygwina. Faktycznie „odtwarza” środowisko dla programu, który wydaje się być linuxem - tzn. Standardowe biblioteki są dostępne wraz z wywołaniami systemowymi POSIX - bez konieczności modyfikacji plików binarnych. W wielu przypadkach plik binarny zbudowany na Ubuntu można skopiować bezpośrednio do bash w środowisku Windows i uruchomić bez żadnych problemów.
Aby zostać rozpoznanym jako poprawny plik wykonywalny w bash na Windowsie, musi być w natywnym formacie binarnym linux lub w pliku skryptu oznaczonym programem do interpretacji (dla skryptu bash, #! / Bin / bash). Natywny plik binarny dla systemu Linux zostanie zbudowany na podstawie bibliotek systemu Linux i wywołań systemowych. Bash potwierdza, że coś jest poprawnym plikiem wykonywalnym, zarówno poprzez sprawdzenie bitów uprawnień, jak i sprawdzenie formatu pliku binarnego, który jest kompatybilny (sprawdzenie „magicznej liczby”). Jeśli jest to plik binarny i nie ma formatu ELF, nie jest narażony na powłokę poprzez rozwinięcie ścieżki.
Aby trudniej było wyjaśnić ten problem, dodali częściową możliwość uruchamiania natywnych aplikacji Windows z bash na Windowsie, ale wyraźnie nie rozwiązali problemu sprawdzania formatu pliku binarnego rozszerzenia ścieżki bash - lub zrobili to i jest to błąd.
Druga edycja:
Wyjaśnienie twojego pytania:
Kiedy uruchomisz go bezpośrednio (./mvn), pominie on ocenę Bash i po prostu ją wykona. Bash w środowisku Windows jest wystarczająco inteligentny, aby uruchomić natywne pliki wykonywalne systemu Windows, które muszą być. Nie sądzę, aby binarny plik binarny cygwina uruchamiał się poprawnie po bashu, ale mogłem być niepoprawny - dokumentacja jest w tej chwili skąpa i nie mam obecnie dostępnego środowiska testowego.
Obejście, które zapewnia równoważne możliwości obsługi „ścieżki”:
Jeśli jesteś w inny sposób całkowicie zadowolony z instalacji maven (żadnych innych problemów ze zgodnością, wszystko po prostu „działa”), ale ważne jest, aby mieć to na swojej drodze, możesz zastosować proste obejście, które zapewni równoważne możliwości.
W pliku .bashrc dodaj następujący alias:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
Powtórz odpowiednik dla wszystkich innych plików wykonywalnych w tym katalogu, do którego chcesz uzyskać dostęp z dowolnego miejsca w bash w środowisku Windows.
zrestartuj bash lub źródłowy plik, a następnie mvn
będzie działał z dowolnego katalogu (w oparciu o twoją instrukcję, że działało bezpośrednie wykonanie z katalogu bin, ./mvn).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
plik, aby dodać ścieżkę?