BASH в Ubuntu для Windows (підсистема AKA Linux для Windows) 10 - Як встановити свій PATH?


8

Завдяки оновленому ювілею, тепер у мене є BASH на Ubuntu в Windows 10. Раніше я використовував Cygwin і створив Maven в Cygwin (і повністю працював), який значною мірою полягав у встановленні Maven та зміні мого PATHсередовища змінна (в ~/.bashrc)

Ну, я намагаюся зробити те саме, використовуючи BUW, але, наскільки я можу сказати, PATHзмінна ігнорується (додавання каталогу Maven bin до PATH, а потім виконання which mvnповернення порожнім). Чи є мій трюк, якого мені не вистачає, або я повинен налаштувати своє PATHінше в BUW?

Редагувати:

Дозвольте мені бути конкретним. Що мені потрібно зробити в "???" крок, щоб отримати pathTestScript.sh на шлях?

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!'

EDIT 2:

Я хочу бути чітко зрозумілим зі своєю реальною, остаточною метою. У мене в моїй системі встановлені JDK і Apache Maven в звичайних місцях. У мене це обоє працювали чудово в Cygwin. Тепер, коли BUW вийшов, я хочу використовувати їх там, але я не можу зрозуміти, як створити для них своє середовище, оскільки будь-які зміни, внесені в мій PATH, не мають жодного ефекту.

EDIT 3:

Гаразд, тепер я стурбований тим, що я переслідую диких гусей. Якщо я це роблю echo $PATH, я отримую/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Це я очікую. Це те, що я помістив у свій ~/.bashrcфайл ... Потім я це роблю ls /mnt/c/Program\ Files/apache-maven-3.3.9/binі я отримую

m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp

Але коли я це роблю which mvn, я порожній, і якщо посилаюсь mvn, мене переспрямовують використовувати apt-getдля його встановлення.

Тому проблема не в тому, що PATH не оновлюється ... це просто ігнорується. Чи є спосіб змусити його звернути увагу на ПАТ? Якщо ні, то це досить слабка версія Linux (IMO)

EDIT 4:

Це було піднято кілька разів, і так, мій приклад, який вдарив, забув позначити файл як виконуваний. У моєму реальному сценарії (з Maven) усі файли виконуються:

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
Можливо, відредагуйте C:\Users\%username%\AppData\Local\lxss\root\.bashrcфайл зараз, щоб додати шлях?
Петро

@Peter Цього режисера не існує (у мене немає "lxss" нижче Local)
Cody S

1
Введіть його в адресний рядок, у вас він повинен бути. В іншому випадку покажіть приховані системні папки. Увімкнення прихованих папок недостатньо. Дивіться superuser.com/questions/1108483/…
Пітер

Ах, ти маєш рацію ... але зараз я не впевнений, що це моя проблема. Мені доведеться відредагувати своє запитання
Cody S

1
Чому ви запускаєте Windows Maven на Bash? Bash в Windows працює в Linux і може запускати лише нативні Linux-файли. Ви не можете виконувати в ньому файли exe Windows, на відміну від Cygwin, які використовуються для запуску нативної
бінарної файлу

Відповіді:


6

Оновити резюме

Виконані виконавчі файли не є нативним форматом Linux (ELF), вони компілюються для Windows. Під час розширення шляху bash перевіряє магічне число двійкового файлу, якщо він не відповідає ELF, він не піддається його розширенню шляхом. Однак програма bash для Windows включала можливість запуску власних програм Windows з середовища bash, тому пряме виконання (без розширення шляху та подальшої бінарної перевірки) працює чудово.

Дозвіл - це або додавання .bashrc на основі псевдоніму (або будь-яка кількість альтернативних методів для імітації розширення шляху, минаючи в такий спосіб оцінювання файлу bash) або встановлення версії linux.


Оригінальна відповідь

Дозволи файлів

Можливо, проблема дозволів міжфайлової системи. Якщо ви cd /mnt/c/Program\ Files/apache-maven-3.3.9/binспробуєте запустити mvn так, як це ./mvnстанеться?

Який вихід ls -altу цьому каталозі?

Якщо файл не буде належним чином позначений як виконуваний, він не відображатиметься як програма на вашому шляху. Якщо це двійковий файл, а не у форматі 'linux' (ELF), він також не відображатиметься як виконуваний шлях.

Якщо безпосередньо виконання mvn не працює (будь ласка, опублікуйте результати ls), спробуйте додати дозволи на виконання chmod ug+x mvn

Невірна версія встановлена

Ви впевнені, що встановлена ​​нативна версія Linux - та сама версія, яку ви використовували з cygwin, майже точно не працюватиме.

Ви можете перевірити бінарну сумісність з sudo apt-get install elf-binutils файлом mvn, використовуючи команду. readelf -a mvn Якщо ви отримаєте помилку, наприклад "Не файл ELF ...", то у вас є відповідь.

Я щойно помітив, що ви не додали дозволу на виконання сценарію тестової оболонки у своєму прикладі, що (якщо ви просто не забули перерахувати цей крок), повністю пояснює цей конкретний збій.

Підсумок:

  1. Переконайтесь, що виконувані файли в каталозі Maven bin правильно встановлені як виконувані за допомогою chmod. Опублікуйте висновок ls -alt у своїй відповіді.
  2. Переконайтеся, що у вас є бінарний файл Linux - для перевірки скористайтеся програмою утиліти readelf.
  3. Запустіть тест сценарію оболонки ще раз, але цього разу позначте файл виконуваним.

Оновлення

Випускним шляхом була червона оселедець; ви просто намагаєтеся виконати двійковий формат, який не сумісний з Linux у середовищі Windows.

На поверхні два середовища (cygwin та bash на windows) забезпечують дещо схожий досвід користувачів, але реалізація та отримана бінарна сумісність дуже відрізняються.

Підсумок - двійкові формати Cygwin та Linux не сумісні. Вам потрібно встановити нативну версію Linux, щоб запустити її з bash на Windows. Ви також можете скласти його з джерела всередині bash на середовищі Windows; але через "навколишнє середовище" навколишнє середовище я б переймався переслідуванням залежностей.

Короткий опис двох середовищ:

Cygwin є ефективним шаром перекладу, який надає API для системних викликів, які зазвичай недоступні для систем, що не є POSIX, що дозволяє компілювати безліч програм, написаних для запуску на Linux у середовищі Windows. Однак він все ще працює у середовищі "windows" - цей двійковий файл тепер працюватиме лише у середовищі cygwin на Windows. Цей шар перекладу та пов’язані з ним бібліотеки дозволяють зібрати вихідний код, написаний проти API Linux, у середовищі cygwin та запустити у Windows. Бінарні файли, побудовані таким чином, не працюватимуть на Linux або Windows спочатку; тільки в середовищі cygwin.

Навколишнє середовище на вікнах, що надаються canonical, значно відрізняється від cygwin. Він фактично «відтворює» середовище для програми, яка, схоже, є linux - тобто стандартні бібліотеки доступні разом із системними викликами POSIX - не вимагаючи жодних змін у бінарні файли. У багатьох випадках бінарний файл, побудований на основі ubuntu, можна скопіювати безпосередньо в середовище bash на Windows і запустити без жодних проблем.

Щоб його визнали дійсним виконуваним файлом у файлі bash на Windows, він повинен бути у нативному бінарному форматі Linux або файлі сценарію, позначеному програмою для його інтерпретації (для скрипта bash, #! / Bin / bash). Народний бінарний файл Linux буде побудований на основі бібліотек Linux та системних викликів. Bash підтверджує, що щось є дійсним виконуваним файлом як шляхом перевірки виконуваних бітів дозволу, так і для перевірки сумісності формату бінарних файлів (перевірка "магічного числа"). Якщо це двійковий файл і не у форматі ELF, він не піддається впливу оболонки через розширення контуру.

Щоб зробити цю проблему важче уточнити, вони додали часткову здатність запускати нативні програми Windows з bash на windows, але чітко не зверталися до перевірки формату бінарних файлів розширення шляху bash - або вони це зробили, і це помилка.

Друга редакція:

Пояснення щодо вашого питання:

Коли ви запускаєте його безпосередньо (./mvn), він обходить оцінку Bash і просто виконує його. Навколишнє середовище Bash на Windows досить розумне, щоб запустити нативні файли Windows, якими це має бути. Я не вірю, що бінарний файл cygwin запуститься належним чином з bash, але я можу помилитися - документація на даний момент мізерна, і зараз у мене немає доступного тестового середовища.

Обхід, який забезпечує еквівалентну можливість підтримки "шляху":

Якщо ви в іншому випадку цілком задоволені установкою Maven (жодних інших проблем зі сумісністю, все просто "працює"), але важливо мати її на шляху, ви можете скористатися простим рішенням, яке забезпечить еквівалентні можливості.

У свій .bashrc файл додайте наступний псевдонім:

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

Повторіть еквівалент для будь-яких інших виконуваних файлів у тому каталозі, до якого ви хочете отримати доступ з будь-якого місця в середовищі bash для Windows.

перезапустіть bash або джерело файлу, а потім mvnбуде працювати з будь-якого каталогу (виходячи з вашої заяви, що пряме виконання з bin dir, ./mvn, працювало).


Файл виконується, але це не файл ELF ... але що за чорт? Чому Cygwin може запускати цей двійковий файл, але BUW не може? І якщо я перейду до каталогу, я все ще можу виконати ./mvn, і він виконує, і це на моєму шляху, але BUW відмовляється його визнати. Чому бути / не бути файлом ELF має щось спільне з поведінкою PATH?
Cody S

як я вже сказав, Cygwin - це середовище для Windows, і він може запускати лише програми Windows. Bash - це середовище Linux і може запускати лише рідні програми Linux. Вони є окремими середовищами. Просто скопіюйте якусь програму з рідної установки Ubuntu і спробуйте викликати її в bash, вона запуститься без проблем. Але ви не можете запустити додаток Windows в bash. Якщо ви хочете запустити справжній баш, вам потрібно знову налаштувати maven для Linux
phuclv

Я також отримую результат "Не файл ELF", навіть якщо я скопіював maven з іншої машини Linux. Коли я запускаю mvn, я не отримую відповіді. У диспетчері завдань Windows з'являється Java-процес, який мені потрібно врешті-решт вбити, щоб отримати відповідь "Убитий" в bash. Я також отримую абсолютно таку саму поведінку, якщо намагаюся запустити maven з "/ mnt / c / Program Files (x86) / Maven / bin". Будь-які ідеї?
пападі

0

Спробуйте echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(будь-яке ім’я)

source ~/.bash_path

echo $PATH щоб побачити, чи щось зміниться

chmod +x ~/pathTest/pathTestScript.sh Для того, щоб запустити його безпосередньо, потрібно додати право виконання у файл.

pathTestScript.sh

Якщо це працює, просто додайте рядок source ~/.bash_pathу вас ~/.bashrc.

Ви можете звернутися до /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


Я можу попросити /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn, і я додав binPATH, але я все ще не можу which mvnуспішно, що не має для мене сенсу.
Cody S

Дивно. Щоб покращитися під час пошуку відповідей, ви можете спробувати псевдонім Linux, щоб зробити виклик трохи простішим. linfo.org/alias.html
Роден Луо

0

Оскільки він заснований на Ubuntu, фактичним файлом PATH є " /etc/environment" (не показує тип файлу).

$ nano /etc/environmentце найпростіший спосіб редагувати файл. Ви побачите щось подібне:

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

Ви можете додати вибраний вами каталог до кінцевих лапок, після останнього каталогу, додатковою :(двокрапкою) для відмежування від попереднього каталогу.

Нарешті, потрібно запустити файл " /etc/environment"; це можна досягти, ввівши:

$ . /etc/environment

Я запустив їх $ sudo -sі перевірив $ env. Я дещо впевнений, що команда env повинна показувати негайні зміни, а перезапуск повинен завершити її після внесення вибраних змін.


Я редагував своє запитання зі сценарієм, але коли я додав ~ / pathTest до /etc/environmentфайлу, мій файл не додався до шляху. Ваше рішення не працює.
Cody S

не використовувати ~; використовувати повний шлях. Отримайте це, набравши pwd у правильному каталозі
djsmiley2kStaysInside

Я цього не зробив. Все ще не працює. Вибачте, я можу побачити, як це може ввести в оману, але ні, я не використовую ~ у моїх маршрутах env, я завжди їх розширюю
Cody S

Я щойно перевстановив функцію, і я вважаю, що моя відповідь недостатня і лише тимчасово змінює шлях до конкретного сеансу. Я шукаю ще про щось. Вибач Коді.
Кріс Бернард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.