ทำไมคำสั่ง“ ซึ่ง” ไม่ให้เส้นทางที่ถูกต้อง


5

ดูรุ่น mvn ต่อไปนี้ ฉันสงสัยว่าทำไมคำสั่ง "ซึ่ง" ไม่ให้ข้อมูลที่ถูกต้องแก่คุณ

LM-SIN-00676037:myproject haibliu$ mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 01:31:09+0800)
Maven home: /usr/share/maven
Java version: 1.6.0_37, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.8", arch: "x86_64", family: "mac"

LM-SIN-00676037:myproject haibliu$ which mvn
/usr/local/bin/mvn

LM-SIN-00676037:myproject haibliu$ /usr/local/bin/mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 16:44:56+0800)
Maven home: /usr/local/Cellar/maven/3.0.4/libexec
Java version: 1.6.0_37, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.8", arch: "x86_64", family: "mac"

เพื่อชี้แจง: / usr / bin / mvn มาพร้อมกับ Max OS X ของฉัน, Mountain Lion และฉันใช้ Homebrew เพื่อติดตั้ง / usr / local / bin / mvn หลังจากนั้นฉันเปลี่ยนลำดับของ PATH ใน / etc / path

LM-SIN-00676037:myproject haibliu$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
LM-SIN-00676037:myproject haibliu$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

นั่นคือทั้งหมดที่ฉันทำ และฉันใช้เปลือกทุบตี


1
มันแปลกมาก บางทีการเชื่อมโยงที่แปลก ๆ บางแห่ง ลองวิ่งwhich -aแล้วดูว่าเกิดอะไรขึ้น
robmathers

มันจะส่งกลับ 2 อินสแตนซ์ของ mvn: "/ usr / local / bin / mvn" และ "/ usr / bin / mvn" และ "/ usr / local / bin / mvn" มาก่อน
haibin

3
คุณติดตั้ง/usr/local/bin/mvnหลังจากใช้งานmvnเชลล์อินสแตนซ์ปัจจุบันหนึ่งครั้งหรือไม่? Bash มีแนวโน้มที่จะแคชตำแหน่งไบนารี
nohillside

ผลลัพธ์ของtype mvnและpwdควรแจ้งให้คุณทราบหากผลลัพธ์ถูกแฮชโดยเชลล์และหากคุณเกิดขึ้นในไดเร็กทอรีที่พา ธ เลือก mvn โลคัลมากกว่าหนึ่ง "ซึ่ง" ค้นหาก่อน ... ถ้า mvn ถูกแฮช คุณเพียงแค่เริ่มต้นเชลล์ใหม่หรือบังคับให้มีการรีบาวด์ อย่าลังเลที่จะเขียนคำตอบนี้ขึ้นมาเมื่อคุณได้เอ่ยถึงคำใดข้อหนึ่งข้างต้นซึ่งทำให้คุณเศร้าโศกชั่วคราวด้วย mvn
bmike

คำตอบ:


5

ซึ่งเป็นโปรแกรมภายนอกซึ่งพยายามกำหนดว่าเชลล์ของคุณจะแก้ไขคำสั่งจาก $ PATH ที่มีอยู่ได้อย่างไร แต่เป็นไปได้ที่จะทำให้มันผิด

หากคุณใช้ bash เป็นเชลล์ให้ใช้คำสั่ง bash ในตัว "type" เพื่อให้เชลล์บอกตัวเองว่าจะแก้ไขคำสั่งนั้นได้อย่างไร:

$ which mvn
/usr/bin/mvn
$ type mvn
mvn is /usr/bin/mvn
$ type type
type is a shell builtin
$ type which
which is hashed (/usr/bin/which)

คุณสามารถดูได้ที่นี่ว่าในสภาพแวดล้อมของฉันที่ / usr / bin / ซึ่งชนิดของเชลล์ในตัวเห็นด้วย ในของคุณดูเหมือนว่าพวกเขาไม่ได้ แต่ฉันสงสัยว่าทำไมพวกเขาไม่ บางทีคุณมีการเปลี่ยนแปลงในเส้นทางที่ไม่ได้ถูกส่งออก? ลอง "ส่งออกเส้นทาง" จากนั้นเลือก "ที่ mvn" อีกครั้ง


1
"type mvn" ส่งคืน "mvn ถูกแฮช (/ usr / bin / mvn)"
haibin

1
เพื่อยืนยันว่า bash ไม่ได้เลือกเส้นทางที่แสดงโดย / usr / bin / ใด คุณไม่ได้เนื้อหาของ $ PATH ของคุณดังนั้นฉันไม่สามารถบอกได้ว่า mvn ตัวใดที่อยู่ในเส้นทางของคุณ ฉันลองใช้ PATH ที่ไม่คาดคิดและ / usr / bin / ซึ่งยังทำให้ถูกต้อง ตามที่ระบุไว้ข้างต้น bash จะแคชตำแหน่งที่ตั้ง คุณสามารถเริ่มการทุบตีใหม่ได้ แต่ฉันจะบังคับให้มันใหม่อีกครั้งด้วย "hash -r"
Tim B

1
ใช่มันเป็นปัญหาแฮ
haibin

0

สิ่งที่อยู่ในของคุณ$PATH? และที่สำคัญคุณติดตั้งmvnที่ไหน ผมจำได้ว่าเมื่อฉันพยายามที่จะใช้ MacPorts phyton 2.7.3 ผมต้องเพิ่ม/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonที่จุดเริ่มต้นของการ$PATHสำหรับการwhichที่จะให้ฉันหลามขวา เพื่อให้ได้เส้นทางที่ถูกต้องฉันต้องเพิ่มสิ่งนี้ใน~/.bash_profile:

source ~/.bashrc

# MacPorts Installer addition on 2010-03-17_at_21:13:03: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:$PATH

ดังนั้นขึ้นอยู่กับว่าคุณจะต้องแก้ไขเส้นทางตามที่mvn3.0.3 เพื่อให้มีกำปั้น

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