ฉันจะล้างแคชของเส้นทางของ Bash ไปยัง executables ได้อย่างไร


256

เมื่อฉันรันโปรแกรมโดยไม่ระบุพา ธ เต็มไปยังไฟล์ที่เรียกทำงานได้และ Bash ต้องค้นหาไดเรกทอรีใน$PATHเพื่อค้นหาไบนารีดูเหมือนว่า Bash จะจดจำเส้นทางในแคชบางประเภท ตัวอย่างเช่นฉันติดตั้งบิลด์การโค่นล้มจากแหล่งไปยัง/usr/localแล้วพิมพ์svnsync helpที่พรอมต์ Bash Bash หาตำแหน่งไบนารี/usr/local/bin/svnsyncสำหรับ "svnsync" และดำเนินการ จากนั้นเมื่อฉันลบการติดตั้ง Subversion ใน/usr/localและรันsvnsync helpใหม่ Bash ตอบกลับ:

bash: /usr/local/bin/svnsync: No such file or directory

/usr/bin/svnsyncแต่เมื่อฉันเริ่มตัวอย่างใหม่ของทุบตีพบและรัน

ฉันจะล้างแคชของพา ธ ไปยังไฟล์ที่เรียกทำงานได้อย่างไร


7
ฟีเจอร์ stupidiest ที่เคยมีมา
Romeno

คำตอบ:


322

bashแคชเส้นทางเต็มไปยังคำสั่ง คุณสามารถตรวจสอบว่าคำสั่งที่คุณพยายามเรียกใช้นั้นถูกแฮชด้วยtypeคำสั่ง:

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

หากต้องการล้างแคชทั้งหมด:

$ hash -r

หรือเพียงแค่รายการเดียว:

$ hash -d svnsync

สำหรับข้อมูลเพิ่มเติมให้คำปรึกษาและhelp hashman bash


15
@Daniel มันคุ้มค่าที่เพิ่มใน bash คุณสามารถใช้คำสั่ง "type command " เพื่อหาคำสั่งประเภทไหน - ถ้าคำสั่งของคุณถูกแฮช "type" จะบอกคุณ นอกจากนี้ยังมีประโยชน์ที่จะบอกว่าบางสิ่งบางอย่างเป็นเปลือกในตัวหรือนามแฝง
lunchmeat317

4
ในฐานะที่เป็น FYI การเปลี่ยนเส้นทางที่แคชถ้าทำงานคำสั่งคือcsh rehash
kurtm

ดังกล่าวข้างต้นคำสั่งยังสามารถใช้ได้กับrehash zsh
Neil Traft

สำหรับคำตอบที่สมบูรณ์ยิ่งขึ้นโปรดดูunix.stackexchange.com/questions/86012/…
Ioannis Filippidis

4
ในคำสั่งอย่างใดอย่างหนึ่ง rehashing hash svnsyncเลือกสามารถเรียกโดย
Ioannis Filippidis

25

หากต้องการล้างรายการเดียวคุณต้องมีการตั้งค่าสถานะอื่น:

hash -d svnsync

การ-rตั้งค่าสถานะไม่ใช้พารามิเตอร์และจะลบแคชทั้งหมดเสมอ
(อย่างน้อยใน bash 3.2.39 บน Debian Lenny)


20

มีวิธีแก้ไขไม่ได้กล่าวถึงที่นี่

  1. คุณสามารถปิดการใช้งาน hashing ด้วยset +hหรือset +o hashall

    help set พูดว่า:

    -h - จดจำตำแหน่งของคำสั่งเมื่อค้นหาการประมวลผล นี่คือการเปิดใช้งานโดยค่าเริ่มต้น

    hashall - เหมือนกับ -h

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    set +h
    date # normal date output
  2. คุณสามารถตรวจสอบว่ามีคำสั่งที่พบในตารางแฮชก่อนที่จะพยายามดำเนินการด้วย shopt -s checkhash

    help shopt พูดว่า:

    checkhash - หากตั้งค่า bash จะตรวจสอบว่ามีคำสั่งอยู่ในตารางแฮชก่อนที่จะพยายามเรียกใช้งาน หากคำสั่ง hashed ไม่มีอยู่อีกต่อไปการค้นหาพา ธ ปกติจะถูกดำเนินการ

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    hash -t date # prints /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    shopt -s checkhash # enable command existence check
    date # normal date output
    hash -t date # prints /bin/date
  3. คุณสามารถผูก NAME ด้วย PATH ด้วยhash -p PATH NAMEหรือBASH_CMDS[NAME]=PATH:

    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    BASH_CMDS[date]=/bin/date
    date # normal date output
  4. Magic: PATH="$PATH"ดำเนินการhash -r

    จากvariables.c:

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }

    ลอง:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty

1
ฉันไม่เคยเข้าใจเลยว่าทำไมถึงมีกลไกพิเศษมาให้เมื่อ PATH = $ PATH ใช้งานได้ดี หาก PATH เปลี่ยนไปดังนั้น PATH การค้นหา cache ควรจะไม่ถูกต้อง มีเหตุผล.
jrw32982

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

การแฮชกับตารางแฮชคำสั่งเป็นวิธีที่ยอดเยี่ยมในการสร้างความสับสนให้กับคนที่พยายามดีบักสคริปต์ทุบตี
Erik Aronesty

4

ตามที่ผู้ใช้johntexได้ระบุไว้ในความคิดเห็นต่อคำตอบของผู้ใช้Tobuการกระทำที่ง่ายที่สุดใน Bash คือการทำโปรแกรมของคุณใหม่:

hash svnsync

นั่นคือทั้งหมดที่

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