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/bin
và cố gắng chạy mvn như vậy thì ./mvn
chuyện gì xảy ra?
Đầu ra của ls -alt
thư 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:
- 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.
- 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.
- 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 đó mvn
sẽ 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).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
tập tin bây giờ để thêm đường dẫn?