Dalam keadaan apa executable pertama kali ditemukan di jalan tidak digunakan

15

Saya memiliki beberapa perilaku aneh dengan zsh (5.4.2_1 diinstal dengan homebrew) di osx tidak menggunakan kejadian pertama dari executable di path.

Berikut ini skenarionya:

echo $PATH pengembalian:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

minuman ada di keduanya

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     

dan

usr/local/bin/brew

Ini dikonfirmasikan dengan menjalankan -sebuah yang menghasilkan:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew

Tetapi ketika saya menjalankan yang mana itu kembali:

/usr/local/bin/brew

dan minuman tidak menjalankan /usr/local/bin/brewdaripada/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Bagaimana ini bisa terjadi ketika minuman lebih awal di jalan?

Bantuan dihargai.

kontinum
sumber
7
rehashdan jalankan lagi - jika itu masih terjadi setelah itu, edit di.
Michael Homer
@MichaelHomer: Yup itu orangnya. Pengalaman di sini.
Yosua

Jawaban:

25

which -a cmdmencari semua file biasa bernama cmdyang Anda punya izin mengeksekusi di direktori di $path(selain alias, fungsi, bawaan ...).

Sementara which cmdmengembalikan perintah yang zshakan dijalankan ( whichadalah builtin di zshseperti di tcshtetapi tidak seperti kebanyakan shell lainnya).

zsh, seperti kebanyakan shell lain mengingat jalur executable dalam sebuah hashtabel agar tidak harus mencarinya di semua direktori di $pathsetiap kali Anda menjalankannya.

Tabel hash (diekspos dalam $commandsarray asosiatif dalam zsh) dapat dimanipulasi dengan hashperintah (perintah shell POSIX standar).

Jika Anda telah menjalankan brewperintah (atau which/type/whence brew, atau menggunakan penyelesaian perintah atau apa pun yang akan menyiapkan hash / cache) sebelum ditambahkan ke /usr/local/Cellar/zplug/HEAD-9fdb388/binatau sebelum /usr/local/Cellar/zplug/HEAD-9fdb388/binditambahkan $path, zshakan mengingat jalurnya dan menyimpannya sebagai $commands[brew]=/usr/local/bin/brew.

Dalam hal ini, Anda dapat menggunakan hash -r(seperti dalam shell Bourne) atau rehash(seperti dalam csh) untuk zsh melupakan perintah yang diingat (membatalkan cache itu ), sehingga dapat mencarinya lain kali dan menemukannya di lokasi baru.

Stéphane Chazelas
sumber
Terima kasih - ini memilah masalah. Haruskah saya dapat echo $ command [brew] - Saya tidak melihat apa-apa?
kontinum
1
@continuum, maaf, salahku, itu $commands, tidak $command. Lihat edit.
Stéphane Chazelas
0

/usr/local/bin/brew biasanya merupakan tautan simbolis.

Jadi /usr/local/bin/brewdan /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

mungkin file yang sama.

Tipe:

ls -al /usr/local/bin/brew

untuk mengkonfirmasi.

michael - mlc
sumber