BASH na Ubuntu w Windows (AKA Linux Subsystem dla Windows) 10 - Jak ustawić ŚCIEŻKĘ?


8

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ć, PATHzmienna jest ignorowana (dodawanie katalogu bin Maven do PATH, a następnie wykonywanie which mvnzwraca puste). Czy brakuje mi jakiegoś podstępu, czy muszę PATHinaczej 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 ~/.bashrcpliku ... Potem robię ls /mnt/c/Program\ Files/apache-maven-3.3.9/bini 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-getaby 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

1
Może na razie edytuj C:\Users\%username%\AppData\Local\lxss\root\.bashrcplik, aby dodać ścieżkę?
Peter,

@Peter Ten katalog nie istnieje (nie mam „lxss” poniżej lokalnego)
Cody S

1
Wpisz go w pasek adresu, powinieneś go mieć. W przeciwnym razie pokaż ukryte foldery systemowe. Włączenie ukrytych folderów nie wystarczy. Zobacz superuser.com/questions/1108483/…
Peter,

Ach, masz rację ... ale teraz nie jestem pewien, czy to mój problem. Będę musiał edytować moje pytanie
Cody S

1
Dlaczego uruchamiasz Windows maven w Bash? Bash w systemie Windows działa w systemie Linux i może uruchamiać tylko natywne pliki binarne systemu Linux. Nie można w nim uruchamiać plików exe systemu Windows, w przeciwieństwie do Cygwina, które są używane do uruchamiania natywnych plików binarnych systemu Windows
phuclv

Odpowiedzi:


6

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/bini spróbujesz uruchomić mvn tak, ./mvnco się stanie?

Jakie są dane wyjściowe ls -altw 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:

  1. 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.
  2. Upewnij się, że masz plik binarny z linuksem - użyj do sprawdzenia usety readelf.
  3. 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 mvnbędzie działał z dowolnego katalogu (w oparciu o twoją instrukcję, że działało bezpośrednie wykonanie z katalogu bin, ./mvn).


Plik jest wykonywalny, ale nie jest to plik ELF ... ale co do cholery? Dlaczego Cygwin może uruchomić ten plik binarny, a BUW nie? A jeśli przejdę do katalogu, nadal mogę uruchomić ./mvn, i to się dzieje, i jest na mojej ścieżce, ale BUW odmawia potwierdzenia. Dlaczego bycie / nie bycie plikiem ELF ma coś wspólnego z zachowaniem ŚCIEŻKI?
Cody S,

jak powiedziałem, Cygwin jest środowiskiem Windows i może uruchamiać tylko aplikacje Windows. Bash jest środowiskiem Linuksa i może uruchamiać tylko natywne aplikacje Linux. Są to oddzielne środowiska. Wystarczy skopiować aplikację z natywnej instalacji Ubuntu i spróbować wywołać ją bash, uruchomi się bez problemu. Ale nie można uruchomić aplikacji Windows w bash. Jeśli chcesz działać w trybie bash, musisz ponownie skonfigurować maven dla Linuksa
phuclv

Otrzymuję również wynik „Not an ELF”, mimo że skopiowałem maven z innej maszyny linuxowej. Po uruchomieniu mvn nie otrzymuję odpowiedzi. W menedżerze zadań systemu Windows pojawia się proces Java, który muszę ostatecznie zabić, aby uzyskać odpowiedź „zabity” w bash. Otrzymuję również dokładnie to samo zachowanie, gdy próbuję uruchomić maven z „/ mnt / c / Program Files (x86) / Maven / bin”. Jakieś pomysły?
papadi

0

Spróbuj echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(dowolna nazwa)

source ~/.bash_path

echo $PATH aby sprawdzić, czy coś się zmieni

chmod +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_pathw sobie ~/.bashrc.

Czy możesz to wywołać /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


Mogę wywoływać przez /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvni dodałem go bindo ŚCIEŻKI, ale nadal nie mogę z which mvnpowodzeniem, co nie ma dla mnie sensu.
Cody S,

Dziwne. Aby polepszyć się podczas wyszukiwania odpowiedzi, możesz wypróbować alias Linuksa, aby nieco ułatwić wywołanie. linfo.org/alias.html
Roden Luo

0

Ponieważ jest oparty na Ubuntu, rzeczywisty plik PATH to „ /etc/environment” (nie pokazuje typu pliku).

$ nano /etc/environmentto najłatwiejszy sposób edycji pliku. Zobaczysz coś takiego:

PATH = "/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games"

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:

$ . /etc/environment

Włączyłem je $ sudo -si 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.


Edytowałem swoje pytanie w scenariuszu, ale kiedy dodałem ~ / pathTest do /etc/environmentpliku, mój plik nie został dodany do ścieżki. Twoje rozwiązanie nie działa.
Cody S

nie używaj ~; użyj pełnej ścieżki. Pobierz go, wpisując pwd w odpowiednim katalogu
djsmiley2kStaysInside

Ja nie. Nadal nie działa. Przepraszam, widzę, że to może być mylące, ale nie, nie używam ~ na moich ścieżkach env, zawsze je rozwijam
Cody S

Właśnie wykonałem ponowną instalację funkcji i stwierdzam, że moja odpowiedź nie wystarczy i tylko chwilowo zmienia ścieżkę dla konkretnej sesji. Szukam czegoś więcej. Przepraszam Cody.
Chris Bernard,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.