Neden “hangisini” hangi “hash” olduğunu yazıyor?


31

Kabuk yapılı olması durumunda (örn. typeKendisi):

$ type type
type is a shell builtin

$ which type
<Doesn't return anything since it's a shell builtin, silently exits>

Komut halinde (normal) (örneğin python):

$ type python
python is /usr/bin/python

$ which python
/usr/bin/python

Halinde which(ki bulunan bir komut /usr/bin/which)

$ type which
which is hashed (/usr/bin/which)
$ which which
/usr/bin/which

type whichBunu neden söylüyorsun which is hashed? whichHaşlanmış olmanın önemi ve gerçekte ne anlama geliyor?

Yanıtlar:


40

Büyük olasılıkla uzun bir PATH setine sahipsiniz ve yürütülebilir bir dosyayı bulmak için, kabuğun yolu araması gerekir. Her zaman bir program çalıştırmak istediğinizde bu zaman alıcı işlemi önlemek için, kabuk zaten bulduğu programların bir listesini tutabilir. Bu listeye "karma" denir. Kabuk bunun whichkarma olduğunu söylediğinde, PATH araması yapmış whichve konumunu karma içinde bulmuş ve kaydetmiş demektir.

man bash aşağıdaki gibi açıklar:

Bash, çalıştırılabilir dosyaların tam yol adlarını hatırlamak için bir karma tablosu kullanır (aşağıdaki SHELL BUILTIN KOMUTLARI altında karma bölümüne bakın). PATH içindeki dizinlerin tam araması yalnızca komut karma tabloda bulunmadığında gerçekleştirilir.

Karma normalde kabuk işlemlerini hızlandırırken, sorunlara neden olduğu bir durum vardır. Sisteminizi güncellerseniz ve bunun sonucunda bazı yürütülebilir dosyalar yeni bir konuma taşınırsa, kabuğun kafası karışabilir. Çözüm, hash -rkabuğun tüm karma konumları unutmasına ve PATH'ı sıfırdan aramasına neden olacak şekilde çalışmaktır .

Neden bazı yürütülebilir dosyalar karma dosyalarından eksik?

Çalıştırılabilir bir çalıştırma, en az bir kez yürütene kadar karma yerleştirilmez. Gözlemek:

$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)

python ancak çalıştırıldıktan sonra karıştı.

Bash karma içinde ne incelemek nasıl

Karma içeriği, bashdizide bulunur BASH_CMDS. Bu komutun içinde ne olduğunu görebilirsiniz declare -p BASH_CMDS. Yeni bir kabuk veya alt kabuk açıldığında, karma boştur. Komutlar, kullanıldıkları sırada birer birer eklenir. Yeni açılan bir kabuğundan, aşağıdakilere dikkat edin:

$ 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" )'

+1, oldukça iyi bir açıklama. Ama neden whicholmasın ki python?
jobin

@Jobin Güncelleştirilmiş cevaba bakınız.
John1024

2
Karma kabuğu ancak kabuktan çıkmadığımız zamana kadar devam eder gibi gözüküyor. Terminali yeniden başlattığımızda, komutun kesildiği söylenmiyor.
Aditya,

1
@Aditya Evet. Bunun cevabına bir bölüm ekledim.
John1024

hash -lkullanmaktan daha kolay olurdudeclare -p BASH_CMDS
phuclv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.