สรุปการปรับปรุง
ไฟล์ที่เรียกใช้งานได้นั้นไม่ใช่ linux native format (ELF), มันถูกรวบรวมสำหรับ windows ในระหว่างการขยายเส้นทางทุบตีตรวจสอบจำนวนเวทย์มนตร์ของไบนารีถ้ามันไม่ตรงกับ ELF มันไม่ได้เปิดเผยผ่านการขยายเส้นทาง อย่างไรก็ตาม bash สำหรับ windows ได้รวมความสามารถในการเปิดใช้งานแอปพลิเคชัน windows ดั้งเดิมจากสภาพแวดล้อมของ bash ซึ่งเป็นสาเหตุที่การดำเนินการโดยตรง (โดยไม่มีการขยายเส้นทางและการตรวจสอบไบนารีต่อมา) ทำงานได้ดี
การแก้ไขอาจเป็น alias แบบอิงตาม. bashrc นอกจากนี้ (หรือวิธีการอื่น ๆ ในการเลียนแบบการขยายพา ธ ดังนั้นการข้ามการประเมินไฟล์ bash) หรือการติดตั้งเวอร์ชัน linux
คำตอบเดิม
สิทธิ์ของไฟล์
อาจเป็นปัญหาสิทธิ์ระบบไฟล์ข้าม หากคุณcd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
และพยายามเรียกใช้ mvn เช่นนี้./mvn
จะเกิดอะไรขึ้น
ผลลัพธ์ของls -alt
ในไดเรกทอรีนั้นคืออะไร?
หากไฟล์ไม่ได้รับการทำเครื่องหมายอย่างเหมาะสมว่าสามารถเรียกใช้งานได้ไฟล์นั้นจะไม่ปรากฏเป็น 'โปรแกรม' บนเส้นทางของคุณ หากเป็นไฟล์ไบนารีและไม่อยู่ในรูปแบบ 'linux' (ELF) ก็จะไม่ปรากฏเป็นพา ธ ที่สามารถเรียกใช้งานได้
หากการเรียกใช้ mvn โดยตรงไม่ทำงาน (โปรดโพสต์ผลลัพธ์ ls) ให้ลองเพิ่มการอนุญาตให้ใช้งาน chmod ug+x mvn
ติดตั้งเวอร์ชันผิด
แน่ใจหรือไม่ว่าคุณติดตั้ง linux เนทิฟ - เวอร์ชั่นเดียวกันกับที่คุณใช้กับ cygwin นั้นแทบจะไม่ทำงานแน่นอน
คุณสามารถตรวจสอบความเข้ากันได้ของไบนารีกับ
sudo apt-get install elf-binutils
ไฟล์ mvn ใช้คำสั่ง
readelf -a mvn
หากคุณได้รับข้อผิดพลาดเช่น 'ไม่ใช่ไฟล์เอลฟ์ ... ' แล้วคุณจะได้คำตอบของคุณ
ฉันเพิ่งสังเกตเห็นว่าคุณไม่ได้เพิ่มสิทธิ์ดำเนินการให้กับสคริปต์เชลล์ทดสอบในตัวอย่างของคุณซึ่ง (ยกเว้นว่าคุณลืมที่จะแสดงรายการขั้นตอน) อธิบายถึงความล้มเหลวนั้นอย่างสมบูรณ์
สรุป:
- ตรวจสอบให้แน่ใจว่าไฟล์ประมวลผลในไดเร็กทอรี maven bin ถูกตั้งค่าอย่างเหมาะสมว่าสามารถเรียกทำงานได้โดยใช้ chmod โพสต์ผลลัพธ์ของ ls -alt ในคำตอบของคุณ
- ตรวจสอบให้แน่ใจว่าคุณมีไบนารีของลินุกซ์ - ใช้ตัวอ่านที่เป็นประโยชน์เพื่อตรวจสอบ
- รันการทดสอบเชลล์สคริปต์ของคุณอีกครั้ง แต่คราวนี้ทำเครื่องหมายไฟล์ที่เรียกใช้งานได้
ปรับปรุง
ปัญหาเส้นทางคือปลาเฮอริ่งแดง คุณเพียงแค่พยายามที่จะดำเนินการรูปแบบไบนารีที่ไม่เข้ากันได้กับ linux บนสภาพแวดล้อมของ windows
บนพื้นผิวทั้งสองสภาพแวดล้อม (cygwin และ bash บน windows) ให้ประสบการณ์การใช้งานที่คล้ายคลึงกัน แต่การใช้งานและความเข้ากันได้ของไบนารีนั้นแตกต่างกันมาก
Bottom line - รูปแบบไบนารี Cygwin และ Linux เข้ากันไม่ได้ คุณต้องติดตั้ง linux native version เพื่อให้มันทำงานได้จาก bash บน windows คุณสามารถรวบรวมจากแหล่งภายใน bash บนสภาพแวดล้อม windows; แต่เนื่องจากธรรมชาติของ 'วันแรก' ของสภาพแวดล้อมฉันจึงกังวลเกี่ยวกับการไล่ตาม
คำอธิบายสั้น ๆ ของสภาพแวดล้อมทั้งสอง:
Cygwin เป็นเลเยอร์การแปลที่มี API สำหรับการเรียกใช้ระบบซึ่งโดยทั่วไปจะไม่พร้อมใช้งานบนระบบที่ไม่ใช่ POSIX ซึ่งช่วยให้คุณสามารถรวบรวมโปรแกรมจำนวนมากที่เขียนเพื่อรันบน linux ในสภาพแวดล้อมของ windows อย่างไรก็ตามมันยังคงทำงานในสภาพแวดล้อม 'windows' ซึ่งไบนารีนั้นจะทำงานในสภาพแวดล้อมของ cygwin บน windows เท่านั้น เลเยอร์การแปลและไลบรารี่ที่เกี่ยวข้องนี้อนุญาตให้ซอร์สโค้ดที่เขียนกับ Linux API ถูกคอมไพล์ในสภาวะแวดล้อม cygwin และทำงานบน windows ไบนารีที่สร้างในลักษณะนี้จะไม่ทำงานบน Linux หรือ Windows ดั้งเดิม เฉพาะในสภาพแวดล้อม cygwin
สภาพแวดล้อมทุบตีบน windows ที่จัดทำโดย canonical นั้นแตกต่างจาก cygwin มาก มัน 'สร้าง' สภาพแวดล้อมจริงสำหรับโปรแกรมที่ดูเหมือนว่าจะเป็นลินุกซ์ - นั่นคือไลบรารีมาตรฐานพร้อมใช้งานพร้อมกับการเรียกระบบ POSIX - โดยไม่ต้องมีการแก้ไขใด ๆ กับไบนารี ในหลายกรณีไบนารีที่สร้างขึ้นกับอูบุนตูสามารถคัดลอกโดยตรงไปยังทุบตีในสภาพแวดล้อมของ windows และทำงานได้โดยไม่มีปัญหาใด ๆ
ในการรับรู้ว่าปฏิบัติการที่ถูกต้องในทุบตีบน windows มันจะต้องอยู่ในรูปแบบไบนารีพื้นเมืองลินุกซ์หรือไฟล์สคริปต์ที่ทำเครื่องหมายด้วยโปรแกรมเพื่อตีความมัน (สำหรับสคริปต์ทุบตี, #! / bin / bash) ลินุกซ์ไบนารีดั้งเดิมจะถูกสร้างขึ้นกับไลบรารีลินุกซ์และการเรียกของระบบ Bash ยืนยันว่ามีบางอย่างที่ใช้งานได้จริงโดยการตรวจสอบบิตสิทธิ์อนุญาตปฏิบัติการและการตรวจสอบรูปแบบไฟล์ไบนารี่ที่เข้ากันได้ (การตรวจสอบ 'หมายเลขมายากล') ถ้ามันเป็นไฟล์ไบนารีและไม่ได้อยู่ในรูปแบบของ ELF มันจะไม่แสดงให้เชลล์เห็นผ่านการขยายเส้นทาง
เพื่อให้ปัญหานี้ยากที่จะชี้แจงพวกเขาได้เพิ่มความสามารถบางส่วนในการเปิดใช้งานแอปพลิเคชัน windows ดั้งเดิมจาก bash บน windows แต่ไม่ได้ระบุที่ชัดเจนถึงการตรวจสอบรูปแบบไบนารีของการขยายเส้นทาง bash - หรือว่าพวกเขาทำได้
แก้ไขครั้งที่สอง:
ชี้แจงคำถามของคุณ:
เมื่อคุณเปิดใช้งานโดยตรง (./mvn) จะข้ามการประเมิน Bash และเพียงดำเนินการ bash บนระบบปฏิบัติการ windows นั้นฉลาดพอที่จะเปิดใช้งานโปรแกรมปฏิบัติการเนทีฟ windows ซึ่งต้องเป็น ฉันไม่เชื่อว่าไบนารี cygwin จะเริ่มต้นอย่างถูกต้องจากการทุบตี แต่ฉันอาจไม่ถูกต้อง - เอกสารไม่เพียงพอในตอนนี้และฉันไม่สามารถเข้าถึงสภาพแวดล้อมการทดสอบได้ในขณะนี้
วิธีแก้ปัญหาที่ให้ความสามารถเทียบเท่ากับการสนับสนุน 'เส้นทาง':
หากคุณพอใจกับการติดตั้ง Maven ทั้งหมด (ไม่มีปัญหาความเข้ากันได้อื่น ๆ ทุกอย่างเป็นเพียง 'งาน') แต่การมีมันไว้บนเส้นทางเป็นสิ่งสำคัญคุณสามารถใช้วิธีแก้ปัญหาง่ายๆซึ่งจะให้ความสามารถที่เทียบเท่ากัน
ในไฟล์. bashrc ของคุณเพิ่มนามแฝงต่อไปนี้:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
ทำซ้ำสิ่งที่เทียบเท่าสำหรับไฟล์ปฏิบัติการอื่น ๆ ในไดเรกทอรีนั้นที่คุณต้องการเข้าถึงจากที่ใดก็ได้ภายใน bash บนสภาพแวดล้อมของ windows
รีสตาร์ท bash หรือแหล่งที่มาของไฟล์จากนั้นmvn
จะทำงานจากไดเรกทอรีใด ๆ (ขึ้นอยู่กับคำสั่งของคุณว่าการดำเนินการโดยตรงจากภายใน bin dir, ./mvn ทำงานได้)
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
ไฟล์ในตอนนี้เพื่อเพิ่มเส้นทางหรือไม่