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 which
karma olduğunu söylediğinde, PATH araması yapmış which
ve 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 -r
kabuğ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, bash
dizide 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" )'
which
olmasın kipython
?