BASH บน Ubuntu บน Windows (ระบบย่อย Linux AKA สำหรับ Windows) 10 - ฉันจะตั้งค่า PATH ได้อย่างไร?


8

ขอบคุณการอัปเดตครบรอบตอนนี้ฉันมี BASH บน Ubuntu บน Windows 10 ก่อนหน้านี้ฉันใช้ Cygwin และตั้งค่า Maven ใน Cygwin (และทำให้มันใช้งานได้อย่างสมบูรณ์) ซึ่งส่วนใหญ่ประกอบด้วยการติดตั้ง Maven แล้วแก้ไขPATHสภาพแวดล้อมของฉันตัวแปร (ใน~/.bashrc)

ฉันพยายามทำสิ่งเดียวกันโดยใช้ BUW แต่เท่าที่ฉันสามารถบอกได้PATHตัวแปรจะถูกละเว้น (เพิ่มไดเรกทอรี Maven bin ลงในPATHแล้วดำเนินการwhich mvnส่งคืนค่าว่าง) มีเคล็ดลับที่ฉันหายไปหรือฉันต้องตั้งค่าของฉันPATHแตกต่างกันใน BUW?

แก้ไข:

ให้ฉันเจาะจง ฉันต้องทำอะไรใน "???" ขั้นตอนในการรับ pathTestScript.sh เข้าสู่เส้นทาง?

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!'

แก้ไข 2:

ฉันต้องการชัดเจนกับเป้าหมายที่แท้จริงและสุดท้ายของฉัน ฉันมี JDK และ Apache Maven ติดตั้งอยู่ในระบบของฉันตามปกติ ฉันมีทั้งสองอย่างนี้ทำงานได้อย่างสมบูรณ์แบบใน Cygwin ตอนนี้ BUW หมดแล้วฉันต้องการใช้มันในนั้นแทน แต่ฉันไม่สามารถหาวิธีตั้งค่าสภาพแวดล้อมของฉันให้พวกเขาได้เนื่องจากการเปลี่ยนแปลงใด ๆ ที่ฉันทำกับ PATH ของฉันดูเหมือนจะไม่มีผลอะไรเลย

แก้ไข 3:

ตกลงตอนนี้ฉันกังวลว่าฉันกำลังไล่ล่าห่านป่า ถ้าฉันทำecho $PATHฉันได้/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

นั่นคือสิ่งที่ฉันคาดหวัง นั่นคือสิ่งที่ฉันใส่ใน~/.bashrcไฟล์ของฉัน... จากนั้นฉันก็ทำls /mnt/c/Program\ Files/apache-maven-3.3.9/binและฉันได้รับ

m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp

แต่เมื่อฉันทำwhich mvnฉันว่างเปล่าและถ้าฉันเรียกใช้mvnฉันจะถูกนำไปใช้apt-getเพื่อติดตั้ง

ดังนั้นปัญหาไม่ใช่ว่า PATH ไม่ได้รับการอัพเดต ... มันแค่ถูกเพิกเฉย มีวิธีที่จะให้ความสนใจกับเส้นทางหรือไม่? ถ้าไม่ใช่นี่เป็น Linux (IMO) รุ่นอ่อนแอ

แก้ไข 4:

มันถูกนำขึ้นมาสองสามครั้งและใช่ตัวอย่างของฉันตบกันลืมที่จะทำเครื่องหมายไฟล์ที่ปฏิบัติการ ในสถานการณ์จริงของฉัน (กับ Maven) ไฟล์นั้นสามารถเรียกใช้งานได้ทั้งหมด:

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

1
อาจแก้ไขC:\Users\%username%\AppData\Local\lxss\root\.bashrcไฟล์ในตอนนี้เพื่อเพิ่มเส้นทางหรือไม่
ปีเตอร์

@Peter ไม่มี dir (ฉันไม่มี 'lxss' ด้านล่าง Local)
Cody S

1
พิมพ์ลงในแถบที่อยู่คุณควรมี มิฉะนั้นแสดงโฟลเดอร์ระบบที่ซ่อนอยู่ การเปิดใช้งานโฟลเดอร์ที่ซ่อนไม่เพียงพอ ดูsuperuser.com/questions/1108483/…
ปีเตอร์

อ่าใช่แล้ว ... แต่ตอนนี้ฉันไม่แน่ใจว่านั่นเป็นปัญหาของฉัน ฉันจะต้องแก้ไขคำถามของฉัน
Cody S

1
เหตุใดคุณจึงเรียกใช้ Windows Maven ใน Bash Bash บน Windows ทำงานภายใน Linux และสามารถเรียกใช้ไบนารีลินุกซ์ดั้งเดิมได้เท่านั้น คุณไม่สามารถเรียกใช้งานไฟล์ exe ของ Windows ได้ซึ่งต่างจาก Cygwin ที่ใช้ในการรันไบนารี Windows แบบดั้งเดิม
phuclv

คำตอบ:


6

สรุปการปรับปรุง

ไฟล์ที่เรียกใช้งานได้นั้นไม่ใช่ 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 หากคุณได้รับข้อผิดพลาดเช่น 'ไม่ใช่ไฟล์เอลฟ์ ... ' แล้วคุณจะได้คำตอบของคุณ

ฉันเพิ่งสังเกตเห็นว่าคุณไม่ได้เพิ่มสิทธิ์ดำเนินการให้กับสคริปต์เชลล์ทดสอบในตัวอย่างของคุณซึ่ง (ยกเว้นว่าคุณลืมที่จะแสดงรายการขั้นตอน) อธิบายถึงความล้มเหลวนั้นอย่างสมบูรณ์

สรุป:

  1. ตรวจสอบให้แน่ใจว่าไฟล์ประมวลผลในไดเร็กทอรี maven bin ถูกตั้งค่าอย่างเหมาะสมว่าสามารถเรียกทำงานได้โดยใช้ chmod โพสต์ผลลัพธ์ของ ls -alt ในคำตอบของคุณ
  2. ตรวจสอบให้แน่ใจว่าคุณมีไบนารีของลินุกซ์ - ใช้ตัวอ่านที่เป็นประโยชน์เพื่อตรวจสอบ
  3. รันการทดสอบเชลล์สคริปต์ของคุณอีกครั้ง แต่คราวนี้ทำเครื่องหมายไฟล์ที่เรียกใช้งานได้

ปรับปรุง

ปัญหาเส้นทางคือปลาเฮอริ่งแดง คุณเพียงแค่พยายามที่จะดำเนินการรูปแบบไบนารีที่ไม่เข้ากันได้กับ 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 ทำงานได้)


ไฟล์นี้สามารถเรียกใช้งานได้ แต่ไม่ใช่ไฟล์ ELF ... แต่มันคืออะไร เหตุใด Cygwin จึงสามารถเรียกใช้ไบนารีนี้ได้ แต่ BUW ไม่สามารถทำได้ และถ้าฉันนำทางไปยังไดเรกทอรีฉันยังคงสามารถเรียกใช้งาน. / mvn และดำเนินการและมันอยู่บนเส้นทางของฉัน แต่ BUW ปฏิเสธที่จะรับทราบ ทำไมการเป็น / ไม่ได้เป็นไฟล์เอลฟ์มีส่วนเกี่ยวข้องกับพฤติกรรมของ PATH บ้าง?
โคดี้ S

อย่างที่ฉันบอก Cygwin เป็นสภาพแวดล้อมของ Windows และสามารถเรียกใช้แอพ Windows ได้เท่านั้น Bash เป็นสภาพแวดล้อม Linux และสามารถเรียกใช้แอพพลิเคชั่นเนทีฟ Linux พวกเขาเป็นสภาพแวดล้อมที่แยกจากกัน เพียงคัดลอกแอพบางอย่างจากการติดตั้ง Ubuntu แบบดั้งเดิมและลองเรียกมันว่าทุบตีมันจะทำงานได้อย่างไม่มีปัญหา แต่คุณไม่สามารถรันแอพ Windows ด้วยการทุบตี หากคุณต้องการที่จะทำงานในทุบตีจริงคุณต้องตั้งค่า Maven สำหรับลินุกซ์อีกครั้ง
phuclv

ฉันยังได้รับผลลัพธ์ "ไม่ใช่ไฟล์เอลฟ์" แม้ว่าฉันจะคัดลอก maven จากเครื่องลินุกซ์เครื่องอื่น เมื่อฉันเรียกใช้ mvn ฉันไม่ได้รับการตอบกลับ กระบวนการ java ปรากฏขึ้นในตัวจัดการงานของ Windows ซึ่งฉันต้องฆ่าในที่สุดเพื่อรับการตอบสนอง "ฆ่า" ในทุบตี ฉันยังได้รับพฤติกรรมเดียวกันหากฉันพยายามเรียกใช้ maven จาก "/ mnt / c / Program Files (x86) / Maven / bin" ความคิดใด ๆ
papadi

0

ลอง echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(ชื่อที่คุณต้องการ)

source ~/.bash_path

echo $PATH เพื่อดูว่ามีอะไรเปลี่ยนแปลงหรือไม่

chmod +x ~/pathTest/pathTestScript.sh ในการเรียกใช้โดยตรงคุณจะต้องเพิ่มสิทธิในการเรียกใช้ลงในไฟล์

pathTestScript.sh

ถ้างานนี้เพียงแค่เพิ่มบรรทัดในตัวคุณsource ~/.bash_path~/.bashrc

คุณสามารถเรียกใช้โดย/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


ฉันสามารถเรียกใช้โดย/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvnและฉันได้เพิ่มbinไปยังเส้นทาง แต่ฉันยังไม่สามารถทำwhich mvnสำเร็จซึ่งทำให้ฉันไม่มีเหตุผล
โคดี้ S

แปลก. เพื่อให้ดีขึ้นในขณะที่คุณกำลังค้นหาคำตอบคุณสามารถลองใช้นามแฝง Linux เพื่อทำให้การเรียกใช้ง่ายขึ้นเล็กน้อย linfo.org/alias.html
Roden Luo

0

เนื่องจากเป็นไฟล์บน Ubuntu ไฟล์ PATH ที่แท้จริงคือ " /etc/environment" (ไม่แสดงประเภทไฟล์)

$ nano /etc/environmentเป็นวิธีที่ง่ายที่สุดในการแก้ไขไฟล์ คุณจะเห็นสิ่งนี้:

PATH = "/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / เกม: / usr / local / เกม"

คุณสามารถเพิ่มไดเรกทอรีที่คุณเลือกก่อนเครื่องหมายอัญประกาศหลังไดเรกทอรีสุดท้ายพร้อมเครื่องหมายเพิ่มเติม:(โคลอน) เพื่อกำหนดขอบเขตจากไดเรกทอรีก่อนหน้า

สุดท้ายคุณต้องเปิดไฟล์ " /etc/environment"; สามารถทำได้โดยพิมพ์ใน:

$ . /etc/environment

ฉันวิ่งเหล่านี้ในและตรวจสอบกับ$ sudo -s $ envฉันค่อนข้างมั่นใจว่าคำสั่ง env ควรแสดงการเปลี่ยนแปลงในทันทีและการรีสตาร์ทควรปิดไว้หลังจากทำการเปลี่ยนแปลงที่เลือก


ฉันได้แก้ไขคำถามของฉันด้วยสถานการณ์ แต่เมื่อฉันเพิ่ม ~ / pathTest ไปที่/etc/environmentไฟล์แล้วไฟล์ของฉันจะไม่ถูกเพิ่มเข้าไปในพา ธ วิธีแก้ปัญหาของคุณไม่ทำงาน
โคดี้ S

อย่าใช้ ~; ใช้เส้นทางแบบเต็ม รับผ่านการพิมพ์ pwd ในไดเรกทอรีที่ถูกต้อง
djsmiley2kStaysInside

ฉันไม่ได้ ยังไม่ทำงาน ขออภัยฉันเห็นว่านั่นอาจทำให้เข้าใจผิด แต่ไม่ฉันไม่ได้ใช้ ~ ในเส้นทาง env ของฉันฉันจะขยายมันออกไปเสมอ
Cody S

ฉันเพิ่งติดตั้งฟีเจอร์ใหม่อีกครั้งและฉันพบว่าคำตอบของฉันไม่พอเพียงและเปลี่ยนเส้นทางชั่วคราวสำหรับเซสชันเฉพาะเท่านั้น ฉันกำลังค้นหาบางอย่างเพิ่มเติม ขออภัยโคดี้
Chris Bernard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.