Dzięki aktualizacji rocznicowej mam teraz BASH na Ubuntu w systemie Windows 10. Wcześniej korzystałem z Cygwin i konfigurowałem Maven w Cygwin (i w pełni działałem), który w dużej mierze polegał na instalacji Maven, a następnie modyfikacji mojego PATH
środowiska zmienna (in ~/.bashrc
)
Cóż, próbuję zrobić to samo za pomocą BUW, ale o ile mogę stwierdzić, PATH
zmienna jest ignorowana (dodawanie katalogu bin Maven do PATH
, a następnie wykonywanie which mvn
zwraca puste). Czy brakuje mi jakiegoś podstępu, czy muszę PATH
inaczej skonfigurować w BUW?
EDYTOWAĆ:
Pozwól mi być konkretny. Co muszę zrobić w „???” krok, aby przenieść pathTestScript.sh na ścieżkę?
mkdir -p ~/pathTest
touch ~/pathTest/pathTestScript.sh
echo '#!/bin/sh' >> ~/pathTest/pathTestScript.sh
echo 'echo "it works!"' >> ~/pathTest/pathTestScript.sh
bash ~/pathTest/pathTestScript.sh
# Should output 'it works!'
# ?????????
pathTestScript.sh
# Should output it works!'
EDYCJA 2:
Chcę być bardzo jasny z moim faktycznym, ostatecznym celem. Mam JDK i Apache Maven zainstalowane w moim systemie w zwykłych miejscach. Oba te działały doskonale w Cygwin. Teraz, gdy BUW jest już dostępny, chcę ich tam użyć, ale nie mogę wymyślić, jak skonfigurować dla nich swoje środowisko, ponieważ wszelkie zmiany, które wprowadzam do mojej PATH, nie wydają się mieć żadnego efektu.
EDYCJA 3:
Ok, teraz martwię się, że gonię za dziką gęś. Jeśli tak echo $PATH
, rozumiem/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Tego się spodziewam. To właśnie umieszczam w moim ~/.bashrc
pliku ... Potem robię ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin
i rozumiem
m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp
Ale kiedy to robię which mvn
, robię się pusty, a jeśli wywołuję mvn
, przekierowuje mnie do użycia, apt-get
aby go zainstalować.
Problem nie polega na tym, że ŚCIEŻKA nie jest aktualizowana ... jest po prostu ignorowana. Czy istnieje sposób, aby zwrócić uwagę na ŚCIEŻKĘ? Jeśli nie, jest to dość słaba wersja systemu Linux (IMO)
EDYCJA 4:
Zostało to poruszone kilka razy i tak, mój przykuty razem przykład zapomniał oznaczyć plik jako wykonywalny. W moim rzeczywistym scenariuszu (z Maven) wszystkie pliki są wykonywalne:
cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin && ls -alt
total 36
dr-xr-xr-x 2 root root 0 Apr 19 11:56 ..
-r-xr-xr-x 1 root root 1843 Apr 19 11:56 mvnyjp
dr-xr-xr-x 2 root root 0 Apr 19 11:56 .
-r-xr-xr-x 1 root root 1815 Apr 19 11:56 mvnDebug
-r-xr-xr-x 1 root root 7383 Apr 19 11:56 mvn
-r-xr-xr-x 1 root root 1513 Apr 19 11:56 mvnDebug.cmd
-r-xr-xr-x 1 root root 6067 Apr 19 11:56 mvn.cmd
-r-xr-xr-x 1 root root 230 Apr 19 11:56 m2.conf
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
plik, aby dodać ścieżkę?Odpowiedzi:
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 poleceniareadelf -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:
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:
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).źródło
Spróbuj
echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path
(dowolna nazwa)source ~/.bash_path
echo $PATH
aby sprawdzić, czy coś się zmienichmod +x ~/pathTest/pathTestScript.sh
Aby uruchomić go bezpośrednio, musisz dodać prawo wykonania do pliku.pathTestScript.sh
Jeśli to zadziała, po prostu dodaj linię
source ~/.bash_path
w sobie~/.bashrc
.Czy możesz to wywołać
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
?źródło
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
i dodałem gobin
do ŚCIEŻKI, ale nadal nie mogę zwhich mvn
powodzeniem, co nie ma dla mnie sensu.Ponieważ jest oparty na Ubuntu, rzeczywisty plik PATH to „
/etc/environment
” (nie pokazuje typu pliku).$ nano /etc/environment
to najłatwiejszy sposób edycji pliku. Zobaczysz coś takiego:Możesz dodać wybrany katalog przed końcowymi cudzysłowami, po ostatnim katalogu, z dodatkowym
:
(dwukropkiem), aby oddzielić go od poprzedniego katalogu.Na koniec musisz uruchomić plik „
/etc/environment
”; można to osiągnąć, wpisując:Włączyłem je
$ sudo -s
i sprawdziłem za pomocą$ env
. Jestem pewien, że polecenie env powinno pokazać natychmiastowe zmiany, a ponowne uruchomienie powinno uzupełnić je po dokonaniu wybranych zmian.źródło
/etc/environment
pliku, mój plik nie został dodany do ścieżki. Twoje rozwiązanie nie działa.