Оновити резюме
Виконані виконавчі файли не є нативним форматом 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 ...", то у вас є відповідь.
Я щойно помітив, що ви не додали дозволу на виконання сценарію тестової оболонки у своєму прикладі, що (якщо ви просто не забули перерахувати цей крок), повністю пояснює цей конкретний збій.
Підсумок:
- Переконайтесь, що виконувані файли в каталозі Maven bin правильно встановлені як виконувані за допомогою chmod. Опублікуйте висновок ls -alt у своїй відповіді.
- Переконайтеся, що у вас є бінарний файл Linux - для перевірки скористайтеся програмою утиліти readelf.
- Запустіть тест сценарію оболонки ще раз, але цього разу позначте файл виконуваним.
Оновлення
Випускним шляхом була червона оселедець; ви просто намагаєтеся виконати двійковий формат, який не сумісний з 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, працювало).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
файл зараз, щоб додати шлях?