Bash จะจำเส้นทางที่ผิดไปยังโปรแกรมที่ถูกย้าย / ลบ


29

เมื่อฉันทำ

which pip3

ฉันเข้าใจ

/usr/local/bin/pip3

แต่เมื่อฉันพยายามที่จะดำเนินการpip3ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

bash: /usr/bin/pip3: No such file or directory

นี่เป็นเพราะฉันเพิ่งลบไฟล์นั้น ตอนนี้whichจุดที่คำสั่งรุ่นของผู้อื่นpip3ที่อยู่ใน/usr/local/binแต่เปลือกยังคงจำเส้นทางที่ผิด ฉันจะทำให้มันลืมเส้นทางนั้นได้อย่างไร

whichคู่มือบอกว่า

which returns the pathnames of the files (or links) which would be executed in the current environment, had its arguments been given as commands in
       a strictly POSIX-conformant shell.  It does this by searching the PATH for executable files matching the names of the arguments. It does not follow
       symbolic links.

ทั้งสอง/usr/local/binและ/usr/binอยู่ในPATHตัวแปรของฉันและ/usr/local/bin/pip3ไม่ใช่ลิงก์สัญลักษณ์มันเป็นไฟล์ปฏิบัติการ เหตุใดจึงไม่ทำงาน


เนื้อหาของ/usr/local/bin/pip3คืออะไร?
โทมัส

ก่อนหน้านี้คุณเคยใช้งานpip3เชลล์ในขณะ/usr/binนั้นหรือไม่
Eric Renouf

1
คุณเห็นว่าคุณทำงานhash -t pip3อะไร
Eric Renouf

1
@Eric Renouf hash -t pip3พิมพ์/usr/bin/pip3
spiderface

2
ถ้าคุณมีเหตุผลที่ดีมากที่คุณควรใช้typeeather whichกว่า typeสร้างขึ้นในเชลล์ posix และบอกคุณว่าเชลล์จะทำอะไรมากกว่าwhichที่จะพยายามเดาว่าเชลล์จะทำอะไร
รัส

คำตอบ:


37

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

หากคุณรันhash -d pip3มันจะเป็นการบอกให้ทุบตีเพื่อลืมตำแหน่งเก่าและควรหาที่ใหม่ในครั้งต่อไปที่คุณลอง


4
หรือhash -rเพื่อล้างตารางทั้งหมด
mattdm

ใช่มันใช้ได้ผล whichผมคิดว่าผมจะเปลี่ยนชื่อของคำถามเพราะมันมีอะไรจะทำอย่างไรกับ
spiderface

1
@spiderface สำหรับคุณสมบัติทุบตีส่วนใหญ่ใช้งานได้ง่ายกว่าhelpแทนที่จะเป็นมนุษย์ดังนั้นที่นี่help hash
Eric Renouf

3
@spiderface type hashจะบอกคุณว่ามันเป็น shell builtin ดังนั้นจึงไม่มี man page ของตัวเอง ให้ใช้help hashหรือค้นหาhashในหน้า man ของ bash แทน
deltab

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