Bash mengingat jalur yang salah ke executable yang dipindahkan / dihapus

29

Kapan saya melakukannya

which pip3

saya mendapat

/usr/local/bin/pip3

tetapi ketika saya mencoba mengeksekusi pip3saya mendapatkan kesalahan sebagai berikut:

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

Ini karena saya baru saja menghapus file itu. Sekarang whichperintah menunjuk ke versi lain dari pip3yang terletak di dalam /usr/local/bintetapi shell masih mengingat jalan yang salah. Bagaimana saya membuatnya melupakan jalan itu?

The whichpengguna mengatakan

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.

Keduanya /usr/local/bindan /usr/binberada di PATHvariabel saya , dan /usr/local/bin/pip3bukan tautan simbolis, ini merupakan executable. Jadi mengapa tidak dieksekusi?

spiderface
sumber
Apa isinya /usr/local/bin/pip3?
Thomas
Apakah Anda sebelumnya menjalankan pip3shell itu ketika itu di /usr/bindan kemudian memindahkannya?
Eric Renouf
1
Apa yang Anda lihat jika Anda berlari hash -t pip3?
Eric Renouf
1
@Eric Renouf hash -t pip3mencetak/usr/bin/pip3
spiderface
2
Kecuali Anda memiliki alasan yang sangat bagus, Anda harus selalu menggunakan typeeather daripada which. typedibangun menjadi shell posix dan memberi tahu Anda apa yang akan dilakukan shell, daripada whichmencoba menebak apa yang akan dilakukan shell.
icarus

Jawaban:

37

Ketika Anda menjalankan perintah di bashdalamnya akan mengingat lokasi yang dapat dieksekusi sehingga tidak perlu mencari PATHlagi setiap kali. Jadi jika Anda menjalankan executable, maka ubah lokasi, bashmasih akan mencoba menggunakan lokasi yang lama. Anda harus dapat mengonfirmasi ini dengan hash -t pip3yang akan menunjukkan lokasi lama.

Jika Anda menjalankannya hash -d pip3akan memberitahu bash untuk melupakan lokasi lama dan harus mencari yang baru saat Anda mencoba.

Eric Renouf
sumber
4
Atau hash -runtuk menghapus seluruh tabel.
mattdm
Ya itu berhasil. Saya pikir saya akan mengubah judul pertanyaan karena tidak ada hubungannya dengan which.
spiderface
1
@spiderface untuk sebagian besar fitur bash lebih mudah digunakan helpdaripada pria, jadi di sinihelp hash
Eric Renouf
3
@spiderface type hashakan memberi tahu Anda bahwa itu adalah shell builtin, sehingga tidak memiliki halaman manualnya sendiri. Sebagai gantinya, gunakan help hashatau cari hashdi halaman manual bash.
deltab
1
Atau, jika Anda benar-benar ingin menggunakan man... karena hashini adalah bashbuiltin, Anda ingin man bashmenemukannya. Tapi apa yang dikatakan halaman manual pada dasarnya adalah apa yang help hashingin dikatakan bash
PETA