BASH trên Ubuntu trên Windows (Hệ thống con AKA Linux cho Windows) 10 - Làm cách nào để thiết lập PATH của tôi?


8

Nhờ Bản cập nhật kỷ niệm, giờ đây tôi đã có BASH trên Ubuntu trên Windows 10. Trước đây, tôi đã sử dụng Cygwin và đã thiết lập Maven trong Cygwin, (và nó đã hoạt động hoàn toàn), phần lớn bao gồm cài đặt Maven, sau đó sửa đổi PATHmôi trường của tôi biến (trong ~/.bashrc)

Chà, tôi đang cố gắng làm điều tương tự bằng BUW, nhưng theo như tôi có thể nói, PATHbiến bị bỏ qua (thêm thư mục bin Maven vào PATH, và sau đó thực hiện which mvntrả về trống). Có một mẹo tôi đang thiếu, hay tôi phải thiết lập sự PATHkhác biệt của mình trong BUW?

CHỈNH SỬA:

Hãy để tôi được cụ thể. Tôi cần làm gì trong "???" Bước để có được pathTestScript.sh trên đường dẫn?

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:

Tôi muốn rất rõ ràng với mục tiêu thực tế, cuối cùng của tôi. Tôi đã cài đặt JDK và Apache Maven trên hệ thống của mình ở những nơi thông thường. Tôi đã có cả hai thứ này hoạt động hoàn toàn tốt ở Cygwin. Bây giờ BUW đã hết, tôi muốn sử dụng chúng ở đó, nhưng tôi không thể tìm ra cách thiết lập môi trường của mình cho chúng, vì mọi thay đổi tôi thực hiện đối với PATH của tôi dường như không có tác dụng.

EDIT 3:

Ok, bây giờ tôi lo lắng tôi đang đuổi theo một con ngỗng hoang dã. Nếu tôi làm echo $PATH, tôi nhận được/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Đó là những gì tôi mong đợi. Đó là những gì tôi đưa vào ~/.bashrctập tin của mình ... Sau đó, tôi làm ls /mnt/c/Program\ Files/apache-maven-3.3.9/binvà tôi nhận được

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

Nhưng khi tôi làm which mvn, tôi để trống, và nếu tôi gọi mvn, tôi được chuyển hướng sử dụng apt-getđể cài đặt nó.

Vì vậy, vấn đề không phải là PATH không được cập nhật ... nó chỉ bị bỏ qua. Có cách nào để khiến nó chú ý đến PATH không? Nếu không, đây là phiên bản Linux khá yếu (IMO)

EDIT 4:

Nó đã được đưa lên một vài lần, và vâng, ví dụ tát của tôi đã quên đánh dấu tệp là có thể thực thi được. Trong kịch bản trong thế giới thực của tôi (với Maven), các tệp đều có thể thực thi được:

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ó thể chỉnh sửa các C:\Users\%username%\AppData\Local\lxss\root\.bashrctập tin bây giờ để thêm đường dẫn?
Peter

@Peter Điều đó không tồn tại (Tôi không có 'lxss' bên dưới Địa phương)
Cody S

1
Nhập nó vào thanh địa chỉ, bạn sẽ có nó. Nếu không, hiển thị các thư mục hệ thống ẩn. Kích hoạt các thư mục ẩn là không đủ. Xem superuser.com/questions/1108483/ trộm
Peter

Ah, bạn nói đúng ... nhưng bây giờ tôi không chắc đó là vấn đề của tôi. Tôi sẽ phải chỉnh sửa câu hỏi của mình
Cody S

1
Tại sao bạn chạy Windows maven trong Bash? Bash trên Windows chạy bên trong Linux và chỉ có thể chạy các nhị phân Linux gốc. Bạn không thể thực thi các tệp exe của Windows trong đó, không giống như Cygwin, được sử dụng để chạy các nhị phân Windows gốc
phuclv

Câu trả lời:


6

Tóm tắt cập nhật

Các tệp thực thi trong câu hỏi không phải là định dạng gốc linux (ELF), chúng được biên dịch cho các cửa sổ. Trong quá trình mở rộng đường dẫn, bash kiểm tra số ma thuật của nhị phân, nếu nó không khớp với ELF, thì nó không hiển thị thông qua mở rộng đường dẫn. Tuy nhiên, bash cho windows đã bao gồm khả năng khởi chạy các ứng dụng windows gốc từ môi trường bash, đó là lý do tại sao thực thi trực tiếp (không mở rộng đường dẫn và kiểm tra nhị phân tiếp theo) hoạt động tốt.

Độ phân giải là một bổ sung .bashrc dựa trên bí danh (hoặc bất kỳ số phương thức thay thế nào để bắt chước mở rộng đường dẫn, do đó bỏ qua việc đánh giá tệp bash) hoặc cài đặt phiên bản linux.


Câu trả lời gốc

Quyền tập tin

Đây có thể là một vấn đề quyền hệ thống tập tin chéo. Nếu bạn cd /mnt/c/Program\ Files/apache-maven-3.3.9/binvà cố gắng chạy mvn như vậy thì ./mvnchuyện gì xảy ra?

Đầu ra của ls -altthư mục đó là gì?

Nếu tệp không được đánh dấu đúng là có thể thực thi được, nó sẽ không hiển thị dưới dạng 'chương trình' trên đường dẫn của bạn. Nếu đó là tệp nhị phân và không ở định dạng 'linux' (ELF) thì nó cũng sẽ không hiển thị dưới dạng đường dẫn thực thi.

Nếu trực tiếp thực hiện mvn không hoạt động (vui lòng đăng kết quả ls), hãy thử thêm quyền thực thi chmod ug+x mvn

Phiên bản cài đặt sai

Bạn có chắc chắn đã cài đặt phiên bản gốc linux - phiên bản tương tự bạn đã sử dụng với cygwin gần như chắc chắn sẽ không hoạt động.

Sau đó, bạn có thể kiểm tra tính tương thích nhị phân sudo apt-get install elf-binutils trên tệp mvn, sử dụng lệnh readelf -a mvn Nếu bạn gặp lỗi, chẳng hạn như 'Không phải tệp ELF ... `thì bạn đã có câu trả lời.

Tôi chỉ nhận thấy rằng bạn đã không thêm quyền thực thi vào tập lệnh shell thử nghiệm trong ví dụ của mình, điều này (trừ khi bạn chỉ đơn giản là quên liệt kê bước này), giải thích hoàn toàn sự thất bại cụ thể đó.

Tóm lược:

  1. Hãy chắc chắn rằng các tệp thực thi trong thư mục maven bin được đặt đúng là tệp thực thi bằng cách sử dụng chmod. Đăng kết quả đầu ra của ls -alt trong câu trả lời của bạn.
  2. Hãy chắc chắn rằng bạn có tệp nhị phân linux - sử dụng tiện ích sẵn sàng để xác minh.
  3. Chạy thử nghiệm kịch bản shell của bạn một lần nữa, nhưng lần này đánh dấu tệp thực thi.

Cập nhật

Vấn đề con đường là một cá trích đỏ; bạn chỉ đang cố gắng thực hiện một định dạng nhị phân không tương thích với linux trên môi trường windows.

Nhìn bề ngoài, hai môi trường (cygwin và bash trên windows) cung cấp trải nghiệm người dùng hơi giống nhau nhưng việc thực hiện và kết quả tương thích nhị phân rất khác nhau.

Điểm mấu chốt - Định dạng nhị phân Cygwin và Linux không tương thích. Bạn cần cài đặt phiên bản linux để chạy nó từ bash trên windows. Bạn cũng có thể biên dịch nó từ nguồn bên trong bash trên môi trường windows; nhưng do tính chất 'ngày đầu' của môi trường, tôi lo lắng về việc theo đuổi sự phụ thuộc.

Mô tả ngắn gọn về hai môi trường:

Cygwin thực sự là một lớp dịch cung cấp API cho các cuộc gọi hệ thống thường không có sẵn trên các hệ thống không phải POSIX, cho phép bạn biên dịch nhiều chương trình được viết để chạy trên linux trong môi trường windows. Tuy nhiên, nó vẫn đang chạy trong môi trường 'windows' - nhị phân đó bây giờ sẽ chỉ hoạt động trong môi trường cygwin trên windows. Lớp dịch này và các thư viện liên quan cho phép mã nguồn được viết dựa trên API Linux được biên dịch trong môi trường cygwin và chạy trên windows. Các nhị phân được xây dựng theo cách này sẽ không chạy trên Linux hoặc Windows nguyên bản; Chỉ trong môi trường cygwin.

Môi trường bash trên các cửa sổ được cung cấp bởi canonical khác nhiều so với cygwin. Nó thực sự 'tái tạo' một môi trường cho một chương trình dường như thực sự là linux - tức là các thư viện tiêu chuẩn có sẵn cùng với các cuộc gọi hệ thống POSIX - mà không yêu cầu bất kỳ sửa đổi nào đối với các nhị phân. Trong nhiều trường hợp, một nhị phân được xây dựng dựa trên Ubuntu có thể được sao chép trực tiếp vào bash trên môi trường windows và chạy mà không gặp vấn đề gì.

Để được công nhận là tệp thực thi hợp lệ trong bash trên windows, nó cần phải ở định dạng nhị phân linux gốc hoặc tệp tập lệnh được đánh dấu bằng chương trình để diễn giải nó (đối với tập lệnh bash, #! / Bin / bash). Một nhị phân linux nguyên gốc sẽ được xây dựng dựa trên các thư viện linux và các cuộc gọi hệ thống. Bash xác nhận rằng một cái gì đó là một thực thi hợp lệ cả bằng cách kiểm tra các bit quyền thực thi và kiểm tra định dạng tệp nhị phân có tương thích (kiểm tra 'số ma thuật'). Nếu đó là tệp nhị phân và không ở định dạng ELF, thì nó không được hiển thị với trình bao qua mở rộng đường dẫn.

Để làm cho vấn đề này trở nên khó làm rõ hơn, họ đã thêm một phần khả năng để khởi chạy các ứng dụng windows gốc từ bash trên windows, nhưng rõ ràng không giải quyết được việc kiểm tra định dạng tệp nhị phân mở rộng đường dẫn bash - hoặc họ đã làm và đó là một lỗi.

Chỉnh sửa thứ hai:

Làm rõ về câu hỏi của bạn:

Khi bạn khởi chạy trực tiếp (./mvn), nó bỏ qua đánh giá Bash và chỉ thực hiện nó. Bash trên môi trường windows đủ thông minh để khởi chạy các tệp thực thi riêng của windows, điều này phải có. Tôi không tin rằng một nhị phân cygwin sẽ khởi chạy đúng cách từ bash, nhưng tôi có thể không chính xác - tài liệu này ít ỏi vào thời điểm này và tôi không có môi trường thử nghiệm ngay bây giờ.

Giải pháp cung cấp khả năng tương đương với hỗ trợ 'đường dẫn':

Nếu bạn hoàn toàn hài lòng với cài đặt maven (không có vấn đề tương thích nào khác, mọi thứ chỉ là 'hoạt động'), nhưng có nó trên đường dẫn là quan trọng, bạn có thể sử dụng một cách giải quyết đơn giản sẽ cung cấp khả năng tương đương.

Trong tệp .bashrc của bạn, thêm bí danh sau:

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

Lặp lại tương đương cho bất kỳ thực thi nào khác trong thư mục mà bạn muốn truy cập từ bất cứ đâu trong môi trường bash trên windows.

khởi động lại bash hoặc nguồn tệp, và sau đó mvnsẽ hoạt động từ bất kỳ thư mục nào (dựa trên câu lệnh của bạn thực thi trực tiếp từ trong thư mục bin, ./mvn, đang hoạt động).


Tệp này có thể thực thi được, nhưng nó không phải là tệp ELF ... nhưng cái quái gì vậy? Tại sao Cygwin có thể chạy nhị phân này nhưng BUW không thể? Và nếu tôi điều hướng đến thư mục, tôi vẫn có thể thực thi ./mvn và nó thực thi, và nó nằm trên đường dẫn của tôi, nhưng BUW từ chối thừa nhận nó. Tại sao trở thành / không phải là tệp ELF có liên quan đến hành vi PATH?
Cody S

như tôi đã nói, Cygwin là một môi trường Windows và chỉ có thể chạy các ứng dụng Windows. Bash là một môi trường Linux và chỉ có thể chạy các ứng dụng gốc Linux. Chúng là những môi trường riêng biệt. Chỉ cần sao chép một số ứng dụng từ bản cài đặt Ubuntu gốc và thử gọi nó trong bash, nó sẽ chạy mà không gặp vấn đề gì. Nhưng bạn không thể chạy ứng dụng Windows trong bash. Nếu bạn muốn chạy trong bash thực, bạn cần thiết lập lại maven cho Linux
phuclv

Tôi cũng nhận được kết quả "Không phải là tệp ELF", mặc dù tôi đã sao chép maven từ một máy linux khác. Khi tôi chạy mvn tôi không nhận được phản hồi. Một quy trình java xuất hiện trong trình quản lý tác vụ Windows mà cuối cùng tôi cần phải giết để nhận được phản hồi "Bị giết" trong bash. Tôi cũng nhận được chính xác hành vi tương tự nếu tôi cố chạy maven từ "/ mnt / c / Chương trình tệp (x86) / Maven / bin". Có ý kiến ​​gì không?
papadi

0

Hãy thử echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(bất kỳ tên nào bạn muốn)

source ~/.bash_path

echo $PATH để xem có gì thay đổi không

chmod +x ~/pathTest/pathTestScript.sh Để chạy trực tiếp, bạn phải thêm quyền thực thi vào tệp.

pathTestScript.sh

Nếu điều này hoạt động, chỉ cần thêm dòng source ~/.bash_pathtrong bạn ~/.bashrc.

Bạn có thể gọi bằng /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


Tôi có thể gọi bằng /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvnvà tôi đã thêm binPATH, nhưng tôi vẫn không thể thực hiện which mvnthành công, điều này không có ý nghĩa với tôi.
Cody S

Kỳ dị. Để trở nên tốt hơn trong khi bạn đang tìm kiếm câu trả lời, bạn có thể thử bí danh Linux để làm cho việc gọi đơn giản hơn một chút. linfo.org/alias.html
Roden Luo

0

Vì nó dựa trên Ubuntu, nên tệp PATH thực tế là " /etc/environment" (không hiển thị loại tệp).

$ nano /etc/environmentlà cách dễ nhất để chỉnh sửa tập tin. Bạn sẽ thấy một cái gì đó như thế này:

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

Bạn có thể thêm thư mục bạn chọn trước dấu ngoặc kép, sau thư mục cuối cùng, với :dấu (dấu hai chấm) bổ sung để phân định từ thư mục trước.

Cuối cùng, bạn phải chạy tệp " /etc/environment"; điều này có thể được thực hiện bằng cách gõ vào:

$ . /etc/environment

Tôi chạy chúng trong $ sudo -svà kiểm tra với $ env. Tôi hơi tự tin rằng lệnh env sẽ hiển thị các thay đổi ngay lập tức và khởi động lại sẽ tắt nó sau khi các thay đổi được chọn được thực hiện.


Tôi đã chỉnh sửa câu hỏi của mình bằng một kịch bản, nhưng khi tôi thêm ~ / pathTest vào /etc/environmenttệp, tệp của tôi đã không được thêm vào đường dẫn. Giải pháp của bạn không hoạt động.
Cody S

không sử dụng ~; sử dụng đường dẫn đầy đủ. Nhận nó thông qua việc gõ pwd trong thư mục bên phải
djsmiley2k

Tôi đã không. Vẫn không hoạt động. Xin lỗi, tôi có thể thấy điều đó có thể gây hiểu lầm như thế nào, nhưng không, tôi không sử dụng ~ trong đường dẫn env của mình, tôi luôn mở rộng chúng
Cody S

Tôi mới cài đặt lại tính năng và tôi thấy câu trả lời của mình không đủ và chỉ tạm thời thay đổi đường dẫn cho phiên cụ thể. Tôi đang tìm kiếm thêm một số. Xin lỗi Cody.
Chris Bernard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.