Sự khác biệt giữa cái gì và ở đâu


16

Sự khác biệt giữa wherewhichlệnh shell là gì? Dưới đây là một số ví dụ

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

cũng thế

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

Đối với tôi có vẻ như họ làm cùng một thứ là một vỏ được tích hợp sẵn, không hoàn toàn chắc chắn nó khác với lệnh như thế nào?

Câu trả lời:


11

zshlà một trong số ít shell (những cái khác tcsh( whichcó nguồn gốc là cshtập lệnh cho cshngười dùng, cũng có giới hạn của nó, tcshlàm cho nó trở thành một bản dựng), trong đó whichcó một cái gì đó hợp lý vì nó được tích hợp sẵn, nhưng bằng cách nào đó bạn hoặc hệ điều hành của bạn (thông qua một số rctệp) đã phá vỡ nó bằng cách thay thế nó bằng một lệnh gọi đến whichlệnh hệ thống , điều này không thể làm bất cứ điều gì hợp lý vì nó không có quyền truy cập vào thực tập của shell nên không thể biết cách shell đó diễn giải tên lệnh .

Trong zsh, tất cả which, type, whencewherelà BUILTIN lệnh rằng tất cả đều được sử dụng để tìm hiểu về những gì các lệnh, nhưng với kết quả đầu ra khác nhau. Tất cả đều ở đó vì lý do lịch sử, bạn có thể nhận được tất cả các hành vi của họ với các cờ khác nhau cho whencelệnh.

Bạn có thể nhận được các chi tiết về những gì từng làm bằng cách chạy:

info -f zsh --index-search=which

Hoặc nhập info zsh, sau đó hiển thị chỉ mục ivà nhập tên dựng sẵn (hoàn thành có sẵn).

Và tránh sử dụng /usr/bin/which. Không có vỏ ngày nay nơi đó which là cần thiết. Như Timothy nói, hãy sử dụng nội dung mà vỏ của bạn cung cấp cho điều đó. Hầu hết các shell POSIX sẽ có typelệnh và bạn có thể sử dụng command -vđể chỉ nhận đường dẫn của lệnh (mặc dù cả hai typecommand -vđều là tùy chọn trong POSIX (nhưng không phải là Unix và không còn trong LSB nữa), chúng có sẵn trong hầu hết các Vỏ sò giống như Bourne bạn có thể gặp phải).

(BTW, có vẻ như /usr/binxuất hiện hai lần trong của bạn $PATH, bạn có thể thêm một typeset -U pathvào ~/.zshrc)


2
Điều này đã đưa ra trong một câu hỏi trước đó quá. Để mở rộng điểm này, bạn phải luôn sử dụng lệnh shell được xây dựng trong trường hợp tồn tại. Vì vậy, trong bash, sử dụng "type" thay vì "which."
Tim B

Câu trả lời tuyệt vời và cảm ơn cho lời khuyên đó quá.
nikhil
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.