Perbarui Ringkasan
File yang dapat dieksekusi tersebut bukan format asli linux (ELF), mereka dikompilasi untuk windows. Selama ekspansi jalur, bash memeriksa angka ajaib biner, jika itu bukan pasangan ELF, itu tidak mengeksposnya melalui ekspansi jalur. Namun, bash untuk windows memang menyertakan kemampuan untuk meluncurkan aplikasi windows asli dari lingkungan bash, itulah sebabnya eksekusi langsung (tanpa perluasan jalur dan pemeriksaan biner berikutnya) berfungsi dengan baik.
Resolusi dapat berupa penambahan .bashrc berbasis alias (atau sejumlah metode alternatif untuk meniru perluasan jalur sehingga melewati evaluasi file bash) atau pemasangan versi linux.
Jawaban asli
Izin File
Mungkin masalah izin sistem file silang. Jika Anda cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
dan mencoba menjalankan mvn seperti ./mvn
apa yang terjadi?
Apa output dari ls -alt
direktori itu?
Jika file tidak ditandai dengan benar sebagai file yang dapat dieksekusi, itu tidak akan muncul sebagai 'program' di jalur Anda. Jika ini file biner dan bukan dalam format 'linux' (ELF) maka file itu juga tidak akan ditampilkan sebagai path yang dapat dieksekusi.
Jika mengeksekusi secara langsung mvn tidak berfungsi (silakan kirim hasil ls), coba tambahkan izin eksekusi chmod ug+x mvn
Versi salah diinstal
Apakah Anda yakin telah menginstal versi asli linux - versi yang sama dengan yang Anda gunakan dengan cygwin hampir pasti tidak akan berfungsi.
Anda dapat memeriksa kompatibilitas biner dengan
sudo apt-get install elf-binutils
kemudian pada file mvn gunakan perintah
readelf -a mvn
Jika Anda mendapatkan kesalahan seperti 'Bukan file ELF ... `maka Anda memiliki jawaban Anda.
Saya baru saja memperhatikan bahwa Anda tidak menambahkan izin eksekusi ke skrip shell pengujian dalam contoh Anda, yang (kecuali jika Anda hanya lupa mendaftarkan langkahnya), sepenuhnya menjelaskan kegagalan tersebut.
Ringkasan:
- Pastikan executable di direktori maven bin diatur dengan benar sebagai executable dengan menggunakan chmod. Poskan output ls -alt dalam jawaban Anda.
- Pastikan Anda memiliki biner linux - gunakan utilty readelf untuk memverifikasi.
- Jalankan pengujian skrip shell Anda lagi, tetapi kali ini tandai file yang dapat dieksekusi.
Memperbarui
Masalah jalur adalah herring merah; Anda hanya mencoba menjalankan format biner yang tidak kompatibel dengan linux di lingkungan windows.
Di permukaan dua lingkungan (cygwin dan bash di windows) memberikan pengalaman pengguna yang agak mirip tetapi implementasi dan kompatibilitas biner yang dihasilkan sangat berbeda.
Intinya - format biner Cygwin dan Linux tidak kompatibel. Anda perlu menginstal versi asli linux untuk menjalankannya dari bash di windows. Anda juga dapat mengompilasinya dari sumber di dalam lingkungan bash di windows; tetapi karena sifat 'hari-hari awal' lingkungan saya khawatir tentang mengejar ketergantungan.
Deskripsi singkat dari dua lingkungan:
Cygwin adalah lapisan terjemahan yang secara efektif menyediakan API untuk panggilan sistem yang biasanya tidak tersedia pada sistem non-POSIX, yang memungkinkan Anda mengkompilasi banyak program yang ditulis untuk dijalankan di linux di lingkungan windows. Namun masih berjalan di lingkungan 'windows' - biner sekarang hanya akan beroperasi di lingkungan cygwin di windows. Lapisan terjemahan ini dan pustaka terkait memungkinkan kode sumber yang ditulis dengan Linux API untuk dikompilasi di lingkungan cygwin dan dijalankan di windows. Binari yang dibangun dengan cara ini tidak akan berjalan di Linux atau Windows secara asli; hanya di lingkungan cygwin.
Lingkungan bash pada windows yang disediakan oleh canonical jauh berbeda dari cygwin. Ini sebenarnya 'menciptakan kembali' lingkungan untuk program yang tampaknya benar-benar linux - yaitu perpustakaan standar tersedia bersama dengan panggilan sistem POSIX - tanpa memerlukan modifikasi apa pun pada binari. Dalam banyak kasus biner yang dibangun melawan ubuntu dapat disalin langsung ke bash di lingkungan windows dan berjalan tanpa masalah.
Agar dapat dikenali sebagai executable yang valid dalam bash pada windows, ia harus dalam format biner linux asli atau file skrip yang ditandai dengan program untuk menafsirkannya (untuk skrip bash, #! / Bin / bash). Binari linux asli akan dibangun terhadap pustaka linux dan panggilan sistem. Bash mengonfirmasi bahwa ada sesuatu yang dapat dieksekusi baik dengan memeriksa bit izin yang dapat dieksekusi dan memeriksa format file biner yang kompatibel (pemeriksaan 'angka ajaib'). Jika file biner dan tidak dalam format ELF, itu tidak terkena shell melalui ekspansi jalur.
Untuk membuat masalah ini lebih sulit untuk diklarifikasi, mereka telah menambahkan kemampuan parsial untuk meluncurkan aplikasi windows asli dari bash di windows, tetapi jelas tidak membahas bash path expansion dengan ekspansi format file biner - atau mereka melakukannya dan ini adalah bug.
Sunting kedua:
Klarifikasi atas pertanyaan Anda:
Ketika Anda meluncurkan secara langsung (./mvn) itu melewati evaluasi Bash dan hanya menjalankannya. Lingkungan bash pada windows cukup pintar untuk meluncurkan executable windows asli, yang harus demikian. Saya tidak percaya biner cygwin akan diluncurkan dengan benar dari bash, tapi saya bisa salah - dokumentasi sedikit pada titik ini dan saya tidak memiliki lingkungan pengujian yang dapat diakses saat ini.
Penanganan masalah yang memberikan kemampuan yang setara untuk dukungan 'jalur':
Jika Anda benar-benar senang dengan instalasi maven (tidak ada masalah kompatibilitas lainnya, semuanya hanya 'berfungsi'), tetapi memiliki itu di jalan adalah penting, Anda dapat menggunakan solusi sederhana yang akan memberikan kemampuan yang setara.
Di file .bashrc Anda, tambahkan alias berikut:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
Ulangi yang setara untuk semua executable lainnya di direktori yang Anda ingin akses dari mana saja dalam lingkungan bash di windows.
restart bash atau sumber file, dan kemudian mvn
akan berfungsi dari direktori mana pun (berdasarkan pada pernyataan Anda bahwa eksekusi langsung dari dalam direktori bin, ./mvn, berfungsi).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
file untuk saat ini untuk menambahkan jalur?