Berkat Pembaruan Ulang Tahun, saya sekarang memiliki BASH di Ubuntu pada Windows 10. Sebelumnya, saya menggunakan Cygwin, dan telah menyiapkan Maven di Cygwin, (dan membuatnya berfungsi penuh), yang sebagian besar terdiri dari menginstal Maven, dan kemudian memodifikasi PATH
lingkungan saya variabel (dalam ~/.bashrc
)
Yah, saya mencoba melakukan hal yang sama menggunakan BUW, tetapi sejauh yang saya tahu, PATH
variabel diabaikan (menambahkan direktori bin Maven ke PATH
, dan kemudian menjalankan which mvn
pengembalian kosong). Apakah ada trik yang saya lewatkan, atau apakah saya harus mengatur PATH
berbeda di BUW?
EDIT:
Biarkan saya lebih spesifik. Apa yang harus saya lakukan di "???" langkah untuk mendapatkan pathTestScript.sh ke jalur?
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:
Saya ingin menjadi sangat jelas dengan tujuan akhir saya yang sebenarnya. Saya sudah menginstal JDK dan Apache Maven di sistem saya di tempat-tempat biasa. Saya memiliki keduanya bekerja dengan sangat baik di Cygwin. Sekarang BUW sudah keluar, saya ingin menggunakannya di sana, tetapi saya tidak tahu bagaimana mengatur lingkungan saya untuk mereka, karena setiap perubahan yang saya lakukan pada PATH saya sepertinya tidak berpengaruh.
EDIT 3:
Ok, sekarang saya khawatir saya sedang mengejar angsa liar. Jika saya melakukannya echo $PATH
, saya mengerti/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Itu yang saya harapkan. Itulah yang saya masukkan ke ~/.bashrc
file saya ... Lalu saya lakukan ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin
dan saya dapatkan
m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp
Tetapi ketika saya melakukannya which mvn
, saya menjadi kosong, dan jika saya memohon mvn
, saya diarahkan untuk menggunakannya apt-get
untuk menginstalnya.
Jadi masalahnya bukan bahwa PATH tidak diperbarui ... itu hanya diabaikan. Apakah ada cara untuk mendapatkannya agar memperhatikan PATH? Jika tidak, ini adalah versi Linux (IMO) yang cukup lemah.
EDIT 4:
Sudah dibesarkan beberapa kali, dan ya, contoh menampar saya bersama lupa menandai file sebagai executable. Dalam skenario dunia nyata saya (dengan Maven), semua file dapat dieksekusi:
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
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
file untuk saat ini untuk menambahkan jalur?Jawaban:
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 perintahreadelf -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:
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:
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).sumber
Coba
echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path
(nama apa pun yang Anda inginkan)source ~/.bash_path
echo $PATH
untuk melihat apakah ada perubahanchmod +x ~/pathTest/pathTestScript.sh
Untuk menjalankannya secara langsung, Anda harus menambahkan hak eksekusi ke file.pathTestScript.sh
Jika ini berhasil, cukup tambahkan baris
source ~/.bash_path
di Anda~/.bashrc
.Bisakah Anda memohon
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
?sumber
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
, dan saya telah menambahkannyabin
ke PATH, tetapi saya masih belumwhich mvn
berhasil, yang tidak masuk akal bagi saya.Karena didasarkan pada Ubuntu, file PATH yang sebenarnya adalah "
/etc/environment
" (tidak menampilkan tipe file).$ nano /etc/environment
adalah cara termudah untuk mengedit file. Anda akan melihat sesuatu seperti ini:Anda dapat menambahkan direktori yang Anda pilih sebelum kutipan akhir, setelah direktori terakhir, dengan tambahan
:
(titik dua) untuk dipisahkan dari direktori sebelumnya.Terakhir Anda harus menjalankan file "
/etc/environment
"; ini dapat dilakukan dengan mengetik:Saya menjalankan ini
$ sudo -s
dan memeriksa$ env
. Saya agak yakin perintah env akan menampilkan perubahan langsung, dan memulai ulang harus menyelesaikannya setelah perubahan yang dipilih dibuat.sumber
/etc/environment
file, file saya tidak ditambahkan ke path. Solusi Anda tidak berfungsi.