BASH в Ubuntu в Windows (AKA Linux Subsystem для Windows) 10 - Как мне установить PATH?

11378
Cody S

Благодаря Anniversary Update у меня теперь есть BASH на Ubuntu на Windows 10. Ранее я использовал Cygwin и настроил Maven в Cygwin (и полностью его заработал), который в основном состоял из установки Maven, а затем изменения моей PATHсреды переменная (в ~/.bashrc)

Ну, я пытаюсь сделать то же самое, используя BUW, но, насколько я могу судить, PATHпеременная игнорируется (добавление каталога bin Maven в 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!' 

РЕДАКТИРОВАТЬ 2:

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

РЕДАКТИРОВАТЬ 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)

РЕДАКТИРОВАТЬ 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 
8
Возможно, отредактируйте файл `C: \ Users \% username% \ AppData \ Local \ lxss \ root \ .bashrc`, чтобы добавить путь? Peter 7 лет назад 1
@Peter Этот каталог не существует (у меня нет 'lxss' ниже Local) Cody S 7 лет назад 0
Напечатайте это в адресной строке, у вас должно быть это. В противном случае, показать скрытые системные папки. Включение скрытых папок недостаточно. См. Http://superuser.com/questions/1108483/windows-subsystem-for-linux-sources-list/1108488. Peter 7 лет назад 1
Ах, вы правы ... но теперь я не уверен, что это моя проблема. Мне придется редактировать мой вопрос Cody S 7 лет назад 0
Почему вы используете Windows maven в Bash? Bash на Windows работает в Linux и может запускать только собственные двоичные файлы Linux. Вы не можете запускать в нем исполняемые файлы Windows, в отличие от Cygwin, которые используются для запуска собственных двоичных файлов Windows. phuclv 7 лет назад 1

3 ответа на вопрос

6
Argonauts

Обновить сводку

Эти исполняемые файлы не являются родным форматом 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 на окнах) предоставляют несколько схожий пользовательский интерфейс, но реализация и получающаяся двоичная совместимость очень разные.

Итог - двоичные форматы Cygwin и Linux несовместимы. Вам нужно установить собственную версию linux, чтобы запустить ее из bash на windows. Вы также можете скомпилировать его из исходного кода в среде Windows; но из-за природы среды «ранних дней» я бы беспокоился о погоне за зависимостями.

Краткое описание двух сред:

Cygwin, по сути, представляет собой слой перевода, который предоставляет API для системных вызовов, которые обычно недоступны в системах, отличных от POSIX, что позволяет компилировать многие программы, написанные для запуска на linux в среде Windows. Однако он по-прежнему работает в среде «windows» - этот двоичный файл теперь будет работать только в среде cygwin для Windows. Этот уровень перевода и связанные библиотеки позволяют скомпилировать исходный код, написанный на API Linux, в среде 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).

Файл исполняемый, но это не файл ELF ... но какого черта? Почему Cygwin может запустить этот двоичный файл, а BUW - нет? И если я перейду к каталогу, я все равно смогу выполнить ./mvn, и он выполнится, и он находится на моем пути, но BUW отказывается признать это. Почему наличие / отсутствие файла ELF имеет какое-либо отношение к поведению PATH? Cody S 7 лет назад 0
Как я уже сказал, Cygwin - это среда Windows, и она может запускать только приложения Windows. Bash является средой Linux и может запускать только собственные приложения для Linux. Это отдельные среды. Просто скопируйте какое-нибудь приложение из нативной установки Ubuntu и попробуйте вызвать его в bash, оно запустится без проблем. Но вы не можете запустить приложение Windows в Bash. Если вы хотите работать в реальном bash, вам нужно снова настроить maven для Linux phuclv 7 лет назад 0
Я также получаю результат «Не файл ELF», хотя я скопировал maven с другого компьютера с Linux. Когда я бегу mvn, я не получаю ответа. В диспетчере задач Windows появляется процесс Java, который мне нужно в конечном итоге уничтожить, чтобы получить ответ «Killed» в bash. Я также получаю точно такое же поведение, если я пытаюсь запустить maven из "/ mnt / c / Program Files (x86) / Maven / bin". Есть идеи? papadi 7 лет назад 0
0
Chris Bernard

Поскольку он основан на Ubuntu, фактический файл PATH - это « /etc/environment» (не показывает тип файла).

$ nano /etc/environmentэто самый простой способ отредактировать файл. Вы увидите что-то вроде этого:

PATH = "/ USR / местные / SBIN: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен: / USR / игры: / USR / местные / игры"

Вы можете добавить каталог, который вы выбираете перед заключительными кавычками, после последнего каталога, с дополнительным :(двоеточием), чтобы отделить от предыдущего каталога.

Наконец, вы должны запустить файл " /etc/environment"; это можно сделать, набрав:

$ . /etc/environment 

Я запустил их $ sudo -sи проверил $ env. Я несколько уверен, что команда env должна показывать немедленные изменения, а перезапуск должен завершиться после внесения выбранных изменений.

Я отредактировал свой вопрос по сценарию, но когда я добавил ~ / pathTest в файл `/ etc / environment`, мой файл не был добавлен в путь. Ваше решение не работает. Cody S 7 лет назад 0
не используйте ~; используйте полный путь. Получите его, введя pwd в нужном каталоге djsmiley2k 7 лет назад 0
Я не Все еще не работает. Извините, я вижу, как это может вводить в заблуждение, но нет, я не использую ~ в моих путях env, я всегда расширяю их Cody S 7 лет назад 0
Я только что сделал переустановку функции, и я считаю, что мой ответ не достаточно, и только временно меняет путь для конкретного сеанса. Я ищу еще немного. Прости, Коди. Chris Bernard 7 лет назад 0
0
Roden Luo

Попробуй 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`, и я добавил` bin` в PATH, но я все еще не могу сделать `which mvn `успешно, что не имеет смысла для меня. Cody S 7 лет назад 0
Weird. Чтобы стать лучше во время поиска ответов, вы можете попробовать псевдоним Linux, чтобы сделать вызов немного проще. http://www.linfo.org/alias.html Roden Luo 7 лет назад 0