Trong trường hợp nào thì tệp thực thi đầu tiên được tìm thấy trong đường dẫn không được sử dụng


15

Tôi đang có một số hành vi kỳ lạ với zsh (5.4.2_1 được cài đặt với homebrew) trên osx không sử dụng lần xuất hiện đầu tiên của một tệp thực thi trong đường dẫn.

Đây là kịch bản:

echo $PATH trả về:

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

bia là trong cả hai

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

usr/local/bin/brew

Điều này được xác nhận bằng cách chạy which -a brew trả về:

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

Nhưng khi tôi chạy mà ủ nó trở lại:

/usr/local/bin/brew

brew không chạy /usr/local/bin/brewchứ không phải/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Làm thế nào điều này có thể xảy ra khi bia sớm hơn trong đường dẫn?

Giúp đánh giá cao.


7
rehashvà chạy lại chúng - nếu nó vẫn xảy ra sau đó, hãy chỉnh sửa nó.
Michael Homer

@MichaelHomer: Yup đó là một. Kinh nghiệm ở đây.
Joshua

Câu trả lời:


25

which -a cmdtìm kiếm tất cả các tệp thông thường có tên cmdmà bạn có quyền thực thi trong các thư mục trong $path(ngoài các bí danh, hàm, nội dung ...).

Trong khi which cmdtrả về lệnh zshsẽ chạy ( whichlà một hàm dựng sẵn zshtrong tcshnhưng không giống như hầu hết các shell khác).

zsh, giống như hầu hết các shell khác ghi nhớ đường dẫn của các tệp thực thi trong một hashbảng để không phải tìm kiếm chúng trong tất cả các thư mục trong $pathmỗi lần bạn gọi chúng.

Bảng băm đó (được hiển thị trong $commandsmảng kết hợp trong zsh) có thể được thao tác bằng hashlệnh (lệnh shell POSIX tiêu chuẩn).

Nếu bạn đã chạy brewlệnh (hoặc which/type/whence brew, hoặc đã sử dụng hoàn thành lệnh hoặc bất cứ điều gì có thể bắt đầu bằng hàm băm / bộ đệm) trước khi nó được thêm vào /usr/local/Cellar/zplug/HEAD-9fdb388/binhoặc trước khi /usr/local/Cellar/zplug/HEAD-9fdb388/binđược thêm vào $path, zshsẽ nhớ đường dẫn của nó và lưu trữ dưới dạng $commands[brew]=/usr/local/bin/brew.

Trong trường hợp đó, bạn có thể sử dụng hash -r(như trong trình bao Bourne) hoặc rehash(như trong csh) để zsh quên các lệnh đã nhớ (không hợp lệ bộ đệm đó ), để nó có thể tra cứu lần sau và tìm thấy nó ở vị trí mới.


Cảm ơn - điều này đã sắp xếp vấn đề. Tôi có thể lặp lại lệnh $ [brew] - Tôi không thấy gì?
liên tục

1
@continuum, xin lỗi, xấu của tôi, đó là $commands, không $command. Xem chỉnh sửa.
Stéphane Chazelas

0

/usr/local/bin/brew thường là một liên kết tượng trưng.

Vậy /usr/local/bin/brew/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

có lẽ là cùng một tập tin

kiểu:

ls -al /usr/local/bin/brew

xác nhận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.