BASH di Ubuntu pada Windows (Subsistem AKA Linux untuk Windows) 10 - Bagaimana cara mengatur PATH saya?

8

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 PATHlingkungan saya variabel (dalam ~/.bashrc)

Yah, saya mencoba melakukan hal yang sama menggunakan BUW, tetapi sejauh yang saya tahu, PATHvariabel diabaikan (menambahkan direktori bin Maven ke PATH, dan kemudian menjalankan which mvnpengembalian kosong). Apakah ada trik yang saya lewatkan, atau apakah saya harus mengatur PATHberbeda 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 ~/.bashrcfile saya ... Lalu saya lakukan ls /mnt/c/Program\ Files/apache-maven-3.3.9/bindan 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-getuntuk 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
Cody S
sumber
1
Mungkin mengedit C:\Users\%username%\AppData\Local\lxss\root\.bashrcfile untuk saat ini untuk menambahkan jalur?
Peter
@Peter Dir itu tidak ada (saya tidak punya 'lxss' di bawah Lokal)
Cody S
1
Ketik di bilah alamat, Anda harus memilikinya. Jika tidak, tunjukkan folder sistem yang tersembunyi. Mengaktifkan folder tersembunyi tidak cukup. Lihat superuser.com/questions/1108483/...
Peter
Ah, Anda benar ... tapi sekarang saya tidak yakin itu masalah saya. Saya harus mengedit pertanyaan saya
Cody S
1
Mengapa Anda menjalankan pakar Windows di Bash? Bash pada Windows berjalan di dalam Linux dan hanya dapat menjalankan binari Linux asli. Anda tidak dapat menjalankan file exe Windows di dalamnya, tidak seperti Cygwin yang digunakan untuk menjalankan binari Windows asli
phuclv

Jawaban:

6

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/bindan mencoba menjalankan mvn seperti ./mvnapa yang terjadi?

Apa output dari ls -altdirektori 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:

  1. Pastikan executable di direktori maven bin diatur dengan benar sebagai executable dengan menggunakan chmod. Poskan output ls -alt dalam jawaban Anda.
  2. Pastikan Anda memiliki biner linux - gunakan utilty readelf untuk memverifikasi.
  3. 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 mvnakan berfungsi dari direktori mana pun (berdasarkan pada pernyataan Anda bahwa eksekusi langsung dari dalam direktori bin, ./mvn, berfungsi).

Argonaut
sumber
File ini dapat dieksekusi, tapi ini bukan file ELF ... tapi apa-apaan ini? Mengapa Cygwin dapat menjalankan biner ini tetapi BUW tidak bisa? Dan jika saya menavigasi ke direktori, saya masih bisa menjalankan ./mvn, dan itu dijalankan, dan itu di jalan saya, tetapi BUW menolak untuk mengakuinya. Mengapa menjadi / tidak menjadi file ELF ada hubungannya dengan perilaku PATH?
Cody S
seperti yang saya katakan, Cygwin adalah lingkungan Windows, dan hanya dapat menjalankan aplikasi Windows. Bash adalah lingkungan Linux dan hanya dapat menjalankan aplikasi asli Linux. Mereka adalah lingkungan yang terpisah. Cukup salin beberapa aplikasi dari instal asli Ubuntu dan coba panggil dalam bash, itu akan berjalan tanpa masalah. Tetapi Anda tidak dapat menjalankan aplikasi Windows di bash. Jika Anda ingin menjalankan bash nyata, Anda perlu mengatur ulang maven untuk Linux
phuclv
Saya juga mendapatkan hasil "Bukan file ELF", meskipun saya menyalin maven dari mesin linux lain. Ketika saya menjalankan mvn, saya tidak mendapat jawaban. Proses java muncul di Windows task manager yang akhirnya harus saya bunuh untuk mendapatkan respons "Dibunuh" di bash. Saya juga mendapatkan perilaku yang persis sama jika saya mencoba menjalankan maven dari "/ mnt / c / Program Files (x86) / Maven / bin". Ada ide?
papadi
0

Coba echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(nama apa pun yang Anda inginkan)

source ~/.bash_path

echo $PATH untuk melihat apakah ada perubahan

chmod +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_pathdi Anda ~/.bashrc.

Bisakah Anda memohon /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?

Roden Luo
sumber
Saya dapat meminta /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn, dan saya telah menambahkannya binke PATH, tetapi saya masih belum which mvnberhasil, yang tidak masuk akal bagi saya.
Cody S
Aneh. Untuk menjadi lebih baik saat Anda mencari jawaban, Anda dapat mencoba Linux alias untuk membuat pemanggilan sedikit lebih sederhana. linfo.org/alias.html
Roden Luo
0

Karena didasarkan pada Ubuntu, file PATH yang sebenarnya adalah " /etc/environment" (tidak menampilkan tipe file).

$ nano /etc/environmentadalah cara termudah untuk mengedit file. Anda akan melihat sesuatu seperti ini:

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

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:

$ . /etc/environment

Saya menjalankan ini $ sudo -sdan memeriksa $ env. Saya agak yakin perintah env akan menampilkan perubahan langsung, dan memulai ulang harus menyelesaikannya setelah perubahan yang dipilih dibuat.

Chris Bernard
sumber
Saya telah mengedit pertanyaan saya dengan sebuah skenario, tetapi ketika saya menambahkan ~ / pathTest ke /etc/environmentfile, file saya tidak ditambahkan ke path. Solusi Anda tidak berfungsi.
Cody S
jangan gunakan ~; gunakan path lengkap. Dapatkan melalui ketikkan pwd di direktori yang benar
djsmiley2kStaysInside
Saya tidak melakukannya. Masih tidak berfungsi. Maaf, saya bisa melihat bagaimana itu bisa menyesatkan, tapi tidak, saya tidak menggunakan ~ di jalur env saya, saya selalu mengembangkannya
Cody S
Saya baru saja menginstal ulang fitur dan saya menemukan jawaban saya tidak cukup dan hanya sementara mengubah jalur untuk sesi tertentu. Saya mencari tentang lebih banyak. Maaf Cody.
Chris Bernard