`` Hangi '' komutum yanlış olabilir (bazen)?


17

Son emacs sürümünü kaynak kodundan (v24.2) derledim, çünkü makinemde yüklü olan sürüm (oldukça) benim için (v21.3) eski. Her zamanki gibi yaptım:

$configure --prefix=$HOME
make 
make install

Şimdi emacs test ediyorum ve benim $HOME/binyolum sistem bir geçersiz kılmak gerekiyordu iken (hala benim .bashrcdosyada $ PATH için tercih beri) hala önceki sürümü başlattığını anladım .

İlk düşüncem whichkomut çıktısını görmekti . Ve sürpriz, yeni emac'lara yol veriyor. Burada tutarsızlığın nerede olduğunu anlayamıyorum. Aynı oturumda farklı çıktılar:

$ emacs --version
GNU Emacs 21.3.1

$ `which emacs` --version
GNU Emacs 24.2.1

Emacs içeren takma adım yok. Hiç.

$ alias | grep emacs
$

Neler olduğu hakkında bir fikriniz var mı?


hangi emacs geri dönüyor?
Ulrich Dangel

Yanıtlar:


29

Benim için akla gelen üç olasılık:

  • İçin bir takma ad var emacs(kontrol ettiğiniz)
  • İçin bir işlev var emacs
  • Yeni emacsikili, kabuğunuzun PATH hashtable'ında değil.

Bir fonksiyonunuz olup olmadığını kontrol edebilirsiniz emacs:

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

Ve kaldırın:

unset -f emacs

Kabuğunuzda, PATH'nizdeki her bir ikili dosyaya başvuru içeren bir PATH hashtable da vardır. PATH'nizin başka bir yerinde mevcut olanla aynı ada sahip yeni bir ikili dosya eklerseniz, kabuğun hashtable güncellenerek bilgilendirilmesi gerekir:

hash -r

Ek açıklama:

which bir bash yerleşik olmadığı için işlevler hakkında bilgi sahibi değildir:

bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ `which emacs` --version | head -1
GNU Emacs 22.1.1

Yeni ikili karma davranış bu komut dosyası tarafından gösterilir.

bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin

bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory

Ben çağırmasam da, which cather zaman catPATH'imde birinciyi döndürürüm , çünkü kabuğun hashtable'ını kullanmaz.


1
Burada iyi bilgi olsa da, typekomutta kaçırır .
jordanm

Teşekkürler, bana somun yapan sqlite3 taze derlenmiş bir sürümü ile aynı sorunu vardı (aslında doğru yolu döndü, ama kabuk doğru sqlite3 cli çağırmadı). hash -rsorunumu çözdü.
20:00

12

Evet, hangisini kullanmayın :

  • Bazı sistemlerde, csh betiği olarak uygulanan harici bir komuttur. PATH .
  • Bunun için bir yerleşik var. İki, çift: typeve command. POSIX yolu:

    command -v emacs       # machine-readable format
    type emacs             # human-only format

    Bash'da, type -p emacsyalnızca harici bir komutun yolunu görmek için de kullanabilirsiniz .

Ancak, burada, whichaslında haklı. Bash, komutun bir dahaki sefere daha hızlı çalışabilmesi için hafızadaki bir komutun yeri hakkındaki bilgileri tutar. Bilgisayarınıza yeni bir emacsyürütülebilir dosya yüklediniz PATH, ancak bash önbelleğinde hala eski bir konuma sahip. Run hash emacsbakmak için emacstekrar veya hash -rönbelleği boşaltmak için.


1

Güncellenmiş .bashrcgiriş dosyanızın yeniden okunmasına neden olmak için oturumu kapattınız ve giriş yaptınız mı ? Değilse, mevcut oturumunuzun ortamı güncellenmedi.


Eğer durum böyle `which emacs` --versionolsaydı, hemfikir olurdu emacs --version, çünkü whichPATH'sini mevcut kabuktan miras alır.
mrb

@mrb: İyi ele alındı.
JRFerguson
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.