คุณน่าจะมีชุด PATH ที่มีความยาวและในการค้นหาไฟล์สั่งการเชลล์จำเป็นต้องค้นหาพา ธ เพื่อหลีกเลี่ยงกระบวนการที่ต้องใช้เวลาทุกครั้งที่คุณต้องการเรียกใช้โปรแกรมเชลล์อาจเก็บรายการโปรแกรมที่พบแล้ว รายการนั้นเรียกว่า "แฮช" เมื่อเชลล์บอกว่าwhich
ถูกแฮชหมายความว่ามันทำการค้นหา PATH เรียบร้อยแล้วและพบwhich
และบันทึกตำแหน่งของมันไว้ในแฮช
man bash
อธิบายได้ดังนี้
Bash ใช้ตารางแฮชเพื่อจดจำชื่อพา ธ เต็มของไฟล์ที่เรียกใช้งานได้ (ดูที่แฮชภายใต้คำสั่ง SHELL BUILTIN คำสั่งด้านล่าง) การค้นหาไดเรกทอรีทั้งหมดใน PATH จะดำเนินการเฉพาะในกรณีที่ไม่พบคำสั่งในตารางแฮช
ในขณะที่แฮชจะเร่งความเร็วการทำงานของเชลล์โดยทั่วไปจะมีกรณีหนึ่งที่ทำให้เกิดปัญหา หากคุณอัปเดตระบบของคุณและด้วยเหตุนี้บางไฟล์ที่รันได้จะย้ายไปยังตำแหน่งใหม่เชลล์อาจสับสน วิธีแก้ปัญหาคือการทำงานhash -r
ซึ่งทำให้เชลล์ลืมตำแหน่งที่ถูกแฮชทั้งหมดและค้นหา PATH ตั้งแต่เริ่มต้น
เหตุใดบางไฟล์ประมวลผลจึงหายไปจากแฮช
การปฏิบัติการไม่ได้อยู่ในแฮชจนกว่าคุณจะดำเนินการอย่างน้อยหนึ่งครั้ง สังเกต:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python
ถูกแฮชหลังจากที่ถูกเรียกใช้งานเท่านั้น
วิธีตรวจสอบสิ่งที่อยู่ในแฮชของ bash
เนื้อหาของกัญชาที่มีอยู่ในอาร์เรย์bash
คุณสามารถมองเห็นสิ่งที่อยู่ในนั้นด้วยคำสั่งBASH_CMDS
declare -p BASH_CMDS
เมื่อเปิดเชลล์หรือเชลล์ย่อยใหม่แฮชจะว่างเปล่า คำสั่งจะถูกเพิ่มทีละคำตามที่ใช้ จากเปลือกที่เพิ่งเปิดใหม่สังเกต:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which
และไม่ใช่เพื่อpython
?