ภายใต้สถานการณ์ใดจะปฏิบัติการที่พบครั้งแรกในเส้นทางไม่ได้ใช้


15

ฉันมีพฤติกรรมที่แปลกประหลาดกับ zsh (5.4.2_1 ติดตั้งกับ homebrew) บน osx ที่ไม่ได้ใช้งานครั้งแรกของปฏิบัติการในเส้นทาง

นี่คือสถานการณ์:

echo $PATH ผลตอบแทน:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

ชงเป็นทั้ง

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     

และ

usr/local/bin/brew

นี่คือการยืนยันโดยการทำงานที่ -a ชงซึ่งผลตอบแทน:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew

แต่เมื่อฉันเรียกใช้ที่ชงมันกลับมา:

/usr/local/bin/brew

และการชงไม่ทำงาน/usr/local/bin/brewมากกว่า/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

สิ่งนี้จะเกิดขึ้นได้อย่างไรเมื่อชงก่อนหน้านี้ในเส้นทาง?

ช่วยชื่นชม


7
rehashและเรียกใช้สิ่งเหล่านั้นอีกครั้ง - หากยังเกิดขึ้นหลังจากนั้นให้แก้ไขสิ่งต่อไปนี้
Michael Homer

@MichaelHomer: ใช่นั่นคือสิ่งนั้น สัมผัสประสบการณ์ที่นี่
Joshua

คำตอบ:


25

which -a cmdค้นหาไฟล์ปกติทั้งหมดที่มีชื่อcmdซึ่งคุณได้รับอนุญาตให้ใช้งานในไดเรกทอรีใน$path(นอกเหนือจากนามแฝง, ฟังก์ชั่น, บิวด์อิน ... )

ในขณะที่which cmdส่งกลับคำสั่งที่zshจะทำงาน ( whichเป็น builtin zshเหมือนtcshแต่ไม่เหมือนเชลล์อื่น ๆ ส่วนใหญ่)

zshเช่นเดียวกับเชลล์อื่น ๆ ส่วนใหญ่จะจดจำเส้นทางของไฟล์เอ็กซีคิวต์ในhashตารางเพื่อไม่ให้ค้นหาในไดเรคทอรีทั้งหมดใน$pathแต่ละครั้งที่คุณเรียกใช้

ตารางแฮชนั้น (เปิดเผยใน$commandsอาเรย์แบบเชื่อมโยงในzsh) สามารถจัดการได้ด้วยhashคำสั่ง (คำสั่งเชลล์ POSIX มาตรฐาน)

หากคุณมีการเรียกใช้brewคำสั่ง (หรือwhich/type/whence brewหรือเสร็จสิ้นคำสั่งที่ใช้หรือสิ่งที่จะได้จัดเตรียมไว้ว่ากัญชา / แคช) ก่อนที่มันจะถูกเพิ่มเข้ามา/usr/local/Cellar/zplug/HEAD-9fdb388/binหรือก่อนที่จะ/usr/local/Cellar/zplug/HEAD-9fdb388/binถูกเพิ่มเข้ามา$path, จะได้จำได้ว่าเส้นทางของมันและเก็บไว้เป็นzsh$commands[brew]=/usr/local/bin/brew

ในกรณีดังกล่าวคุณสามารถใช้hash -r(ในเชลล์เป้าหมาย) หรือrehash(ตามใน csh) เพื่อให้มีzsh ลืมคำสั่งที่จำได้ (ทำให้แคชนั้นใช้ไม่ได้) ดังนั้นจึงสามารถค้นหาได้ในครั้งถัดไปและค้นหาในตำแหน่งใหม่


ขอบคุณ - สิ่งนี้จัดเรียงปัญหา ฉันควรจะสามารถสะท้อนคำสั่ง $ [ชง] - ฉันไม่เห็นอะไรเลย?
ความต่อเนื่อง

1
@continuum ขอโทษที่ไม่ดีของฉันที่ไม่$commands $commandดูการแก้ไข
Stéphane Chazelas

0

/usr/local/bin/brew มักจะเป็นลิงค์สัญลักษณ์

ดังนั้น/usr/local/bin/brewและ /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

อาจเป็นไฟล์เดียวกัน

พิมพ์:

ls -al /usr/local/bin/brew

เพื่อยืนยัน.

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