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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.