Обновить сводку
Эти исполняемые файлы не являются родным форматом 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 на окнах) предоставляют несколько схожий пользовательский интерфейс, но реализация и получающаяся двоичная совместимость очень разные.
Итог - двоичные форматы Cygwin и Linux несовместимы. Вам нужно установить собственную версию linux, чтобы запустить ее из bash на windows. Вы также можете скомпилировать его из исходного кода в среде bash на Windows; но из-за природы среды «ранних дней» я бы беспокоился о погоне за зависимостями.
Краткое описание двух сред:
Cygwin, по сути, представляет собой слой перевода, который предоставляет API для системных вызовов, которые обычно недоступны в системах, отличных от POSIX, что позволяет компилировать многие программы, написанные для запуска на linux в среде Windows. Однако он по-прежнему работает в среде «windows» - этот двоичный файл теперь будет работать только в среде cygwin на Windows. Этот уровень перевода и связанные библиотеки позволяют скомпилировать исходный код, написанный на Linux API, в среде cygwin и запускать в Windows. Двоичные файлы, созданные таким образом, не будут работать на Linux или Windows изначально; только в среде cygwin.
Среда bash на окнах, предоставляемых canonical, сильно отличается от cygwin. Он фактически «воссоздает» среду для программы, которая на самом деле выглядит как Linux - то есть стандартные библиотеки доступны вместе с системными вызовами POSIX - без необходимости каких-либо изменений в двоичных файлах. Во многих случаях двоичный файл, созданный для Ubuntu, может быть скопирован непосредственно в среду bash на Windows и запущен без каких-либо проблем.
Чтобы быть распознанным как допустимый исполняемый файл в bash для Windows, он должен быть в собственном двоичном формате linux или в файле сценария, помеченном программой для его интерпретации (для сценария bash, #! / Bin / bash). Нативный двоичный файл Linux будет построен на основе библиотек Linux и системных вызовов. Bash подтверждает, что что-то является допустимым исполняемым файлом, проверяя биты разрешений исполняемого файла и проверяя совместимость двоичного формата файла (проверка «магического числа»). Если это бинарный файл и не в формате ELF, он не отображается в оболочке через расширение пути.
Чтобы сделать эту проблему более трудной для выяснения, они добавили частичную возможность запуска собственных приложений Windows из bash на windows, но явно не обращались к проверке формата двоичного файла расширения пути bash - или сделали это, и это ошибка.
Второе редактирование:
Пояснения по вашему вопросу:
Когда вы запускаете его напрямую (./mvn), он обходит оценку Bash и просто выполняет ее. Среда bash on windows достаточно умна, чтобы запускать собственные исполняемые файлы Windows, что и должно быть. Я не верю, что бинарный файл cygwin будет запускаться должным образом из bash, но я могу ошибаться - на данный момент документация скудна, и у меня нет доступной тестовой среды.
Обходной путь, который обеспечивает эквивалентную возможность для поддержки пути:
Если в остальном вы полностью довольны установкой maven (других проблем с совместимостью нет, все просто «работает»), но важно иметь его на своем пути, вы можете использовать простой обходной путь, который предоставит эквивалентные возможности.
В вашем файле .bashrc добавьте следующий псевдоним:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
Повторите аналог для любых других исполняемых файлов в этом каталоге, к которым вы хотите получить доступ из любой точки среды bash в Windows.
перезапустите bash или создайте исходный файл, и он mvn
будет работать из любого каталога (основываясь на вашем утверждении, что работало прямое выполнение из каталога bin, ./mvn).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
файл, чтобы добавить путь?