Shell - Làm thế nào để tìm thư mục của một số lệnh?


127

Tôi biết rằng khi bạn ở trên shell, các lệnh duy nhất có thể được sử dụng là những lệnh có thể được tìm thấy trên một số thư mục được đặt trên PATH. Ngay cả tôi cũng không biết làm thế nào để xem các dir nào trên biến PATH của mình (và đây là một câu hỏi hay khác có thể được trả lời), điều tôi muốn biết là:

Tôi đến vỏ và viết:

$ lshw

Tôi muốn biết một lệnh trên shell có thể cho tôi biết lệnh này được đặt ở đâu. Nói cách khác, "tập tin thực thi" này nằm ở đâu?

Cái gì đó như:

$ location lshw
/usr/bin

Bất kỳ ai?

Câu trả lời:


187

Nếu bạn đang sử dụng Bash hoặc zsh, hãy sử dụng:

type -a lshw

Điều này sẽ cho thấy mục tiêu là nội dung, hàm, bí danh hay thực thi bên ngoài. Nếu sau này, nó sẽ hiển thị từng nơi nó xuất hiện trong của bạn PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

Trong Bash, cho các hàm type -acũng sẽ hiển thị định nghĩa hàm. Bạn có thể sử dụng declare -f functionnameđể làm điều tương tự (bạn phải sử dụng điều đó cho zsh, vì type -akhông).


Cảm ơn tất cả mọi người đã trả lời, nhưng câu trả lời này là thú vị nhất! Cảm ơn bạn! Tôi đã nghĩ rằng tôi thật điên rồ, bởi vì tôi đã xác định (một thời gian dài trước đây) một cách để làm điều này: 'cập nhật', và điều này đã được thực hiện 'apt-get update; apt-get dist-nâng cấp 'cho tôi. Nhưng hiện tại, tôi đã cố gắng tìm một số tệp update.sh ở đâu đó và tôi không thể tìm thấy nó. Đó là lý do tại sao tôi bắt đầu câu hỏi này. Nhưng bây giờ, bằng cách sử dụng 'loại -a update' tôi thấy rằng đây chỉ là một bí danh được xác định trên .bashrc của tôi nằm trên ~ nhà của tôi. Chân thanh cảm ơn bạn.
Gabriel L. Oliveira

1
@Gabriel: Nếu bạn không quen thuộc với locatenó có thể giúp tìm tệp. Nó sử dụng một cơ sở dữ liệu được duy trì bởi updatedbnó được chạy từ một công việc định kỳ. Vì locatetìm kiếm một cơ sở dữ liệu thay vì toàn bộ hệ thống tập tin, nó nhanh hơn nhiều find(có thể được sử dụng như là phương sách cuối cùng).
Tạm dừng cho đến khi có thông báo mới.

Cảm ơn bạn. Tôi sẽ nghiên cứu công cụ này và xem cách cập nhật được lên lịch để chạy trên cronjob của Ubuntu.
Gabriel L. Oliveira

Đôi khi type -acó thể gây nhầm lẫn. ví dụ trong trường hợp nvmđó là hàm bash tôi cần làm: type -a nvm | head -n1để tìm hiểu chính xác nó là gì nvm.
Marinos

@MarinosAn: Đối với các hàm, type -axuất định nghĩa hàm cũng như kiểu thực thi. Rủi ro khi sử dụng headlà trong trường hợp tên có nhiều hơn một loại, các loại bổ sung sẽ không được xuất. Bạn có thể muốn nhìn vào type -t.
Tạm dừng cho đến khi có thông báo mới.

64

Như thế này:

which lshw

Để xem tất cả các lệnh khớp trong đường dẫn của bạn:

which -a lshw 

7
cũng vậy -a lshw để xem tất cả các lệnh khớp với đường dẫn của bạn.
AlG

Tôi tin rằng điều này chỉ hoạt động với các lệnh (thực thi trên $ PATH), không phải chức năng.
Olivier Lacan

whichlà vấn đề bởi vì có nhiều triển khai, nhiều trong số đó hoàn toàn làm sai, và những cái khác có vẻ hoạt động tốt, nhưng có những bất ngờ kỳ lạ. Bạn nên thích typethay thế.
tripleee

Không hoạt động cho các bí danh và hàm bash. Ít nhất là trên Ubuntu. Sử dụng tốt hơntype -a lshw
Marinos An

17

PATH là một biến môi trường và có thể được hiển thị bằng lệnh echo:

echo $PATH

Đó là danh sách các đường dẫn được phân tách bằng ký tự dấu hai chấm ' :'

Các whichlệnh sẽ cho bạn biết tập tin được thực hiện khi bạn chạy một lệnh:

which lshw

đôi khi những gì bạn nhận được là một đường dẫn đến một liên kết tượng trưng; nếu bạn muốn theo dõi liên kết đó đến nơi thực thi thực tế, bạn có thể sử dụng readlinkvà cung cấp cho nó đầu ra của which:

readlink -f $(which lshw)

Các -fthông số chỉ thị readlinkđể giữ sau khi liên kết tượng trưng một cách đệ quy.

Đây là một ví dụ từ máy của tôi:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh

5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz

3

Trong TENEX C Shell, tcsh , người ta có thể liệt kê (các) vị trí của lệnh hoặc nếu đó là lệnh tích hợp, sử dụng wherelệnh, ví dụ:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd


0

Một thay thế cho type -acommand -V

Vì hầu hết những lần tôi chỉ quan tâm đến kết quả đầu tiên, tôi cũng từ đầu. Bằng cách này, màn hình sẽ không tràn ngập mã trong trường hợp hàm bash.

command -V lshw | head -n1
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.