'Mèo' là một vỏ được tích hợp hoặc một chương trình bên ngoài?


33

Khi tôi sử dụng typelệnh để tìm hiểu xem catshell có tích hợp hay chương trình bên ngoài không, tôi nhận được đầu ra bên dưới:

-$ type cat
cat is hashed (/bin/cat)
-$

Điều này có nghĩa là đó catlà một chương trình bên ngoài /bin/cat?

Tôi đã bối rối, bởi vì khi tôi kiểm tra đầu ra bên dưới, echotôi đã thấy rằng đó là built-inmột chương trình nhưng cũng là một chương trình/bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

Vì vậy, tôi không thể sử dụng logic /bin/catcó nghĩa là một chương trình bên ngoài, bởi vì tiếng vang /bin/echovẫn còn nhưng được tích hợp sẵn.

Vậy làm thế nào để tôi biết nó catlà gì? Tích hợp hay bên ngoài?


1
-Cách lệnh là một chương trình bên ngoài tạo nên một phần của hệ thống, vì nhiều nguyên nhân mà nó có thể thực hiện không phải là một tích hợp đơn giản.
Joke Sr. OK

12
type whichcó thể cho bạn câu trả lời tại sao whichsẽ không cho bạn câu trả lời.
Dubu

1
Phụ thuộc vào vỏ bạn đang sử dụng
nsn

6
Sự thật thú vị: cả hai catlsđược / được viết bởi chính Stallman. Bạn sẽ ngạc nhiên về những gì anh ấy đã viết. Đừng quên anh ấy đã viết các phiên bản đầu tiên của trình biên dịch ngày nay là trình biên dịch tốt nhất trên thế giới biên dịch MỌI THỨ và hầu hết các tiện ích cốt lõi. Chỉ cần nói
Alec Teal

2
@AlecTeal Bạn có nhận ra rằng hầu hết các hệ thống Unix đều sử dụng các phiên bản ls và cat từ lâu trước các phiên bản GNU mà Richard Stallman đã có trong tay?
Ross Ridge

Câu trả lời:


59

typecho bạn biết những gì vỏ sẽ sử dụng. Ví dụ:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

Điều đó có nghĩa là nếu tại dấu nhắc bash, bạn nhập echo, bạn sẽ nhận được tích hợp sẵn. Nếu bạn chỉ định đường dẫn, như trong /bin/echo, bạn sẽ nhận được lệnh bên ngoài.

which, ngược lại là một chương trình bên ngoài không có kiến ​​thức đặc biệt về những gì shell sẽ làm. Trên các hệ thống giống như debian, whichlà một tập lệnh shell tìm kiếm PATH để thực thi. Vì vậy, nó sẽ cung cấp cho bạn tên của tệp thực thi bên ngoài ngay cả khi shell sẽ sử dụng tích hợp sẵn.

Nếu một lệnh chỉ có sẵn dưới dạng tích hợp, whichsẽ không trả về gì:

$ type help
help is a shell builtin
$ which help
$ 

Bây giờ, hãy xem cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat là một thực thi bên ngoài, không phải là một vỏ dựng sẵn.


5
Bạn có thể type -all echotìm ra (theo thứ tự) là "tiếng vang" khác nhau được biết đến với vỏ (cái đầu tiên là vỏ sẽ gọi, nếu bạn không chỉ định thứ gì đó để thay đổi thứ tự, như gọi "echo"hoặc \echo, hoặc command echo)
Olivier Dulac

Câu trả lời tốt. Một bổ sung: Có hai phiên bản echovì lý do lịch sử. Nó bắt đầu như một lệnh bên ngoài, sau đó được thêm vào dưới dạng tích hợp. Các phiên bản đầu tiên của vỏ Bourne ( /bin/sh) không có nó. /bin/echođã được giữ cho tương thích, vì tất cả các loại phụ thuộc vào nó. (Điều tương tự cũng xảy ra với test.)
alexis

Lưu ý bên lề: whichbản thân nó có thể là một vỏ được tích hợp sẵn, ví dụ như trong tcsh:which which which: shell built-in command.
Dan Cornilescu

Tôi đến bữa tiệc muộn, nhưng tại sao bạn không kiểm tra trang người dùng của nó và bạn thực sự có thể thấy số giữa dấu ngoặc đơn, cho biết đó có phải là vỏ được tích hợp sẵn hay không
poz2k4444

46

cat is hashed (/bin/cat)giống như cat is /bin/cat(đó là một chương trình bên ngoài ).

Sự khác biệt là bạn đã chạy cattrong phiên này, vì vậy bash đã tra cứu nó $PATHvà lưu trữ vị trí kết quả trong bảng băm để không phải tìm kiếm lại trong phiên này.

Để xem tất cả các lệnh đã được băm trong phiên của bạn, hãy chạy hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
Trên thực tế, theo tôi đây là câu trả lời duy nhất giải quyết câu hỏi của bạn :)
André Chalella

IMHO này ^^ ^ ^ là sự thật. Câu trả lời này nên được chấp nhận.
LinuxSecurityFreak

4

Một cách khác để kiểm tra danh sách dựng sẵn shell: Sử dụng compgenchính shellin!

Lệnh sau liệt kê tất cả các lệnh dựng sẵn shell:

compgen -b

Bạn có thể kiểm tra cat, echobằng cách greping như: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Bạn có thể thấy compgen -b | grep catlợi nhuận không có đầu ra, có nghĩa catlà không được dựng sẵn .

Truy cập vào một danh sách các tùy chọn hữu ích được cung cấp bởi compgen.


Bạn cũng có thể sử dụng một lệnh dựng sẵn khác: helpđể hiển thị shellin.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

Tôi không thể tìm thấy bất kỳ tài liệu chính thức nào cho các tùy chọn này, bạn có biết nó tồn tại ở đâu không?
Random832

@ Random832 bạn đang nói về các lựa chọn cho compgen?
Pandya

vâng, tôi không thể tìm thấy bất cứ điều gì trong trang web của Bash về ý nghĩa của -b hoặc một nửa các tùy chọn khác. Tìm thấy nó sau tại gnu.org/software/bash/manual/html_node/ Kẻ
Random832

@ Random832 thử man bash | grep -e '-A action$' -A 32bạn có thể nhận được đầu ra như thế này . (tăng / giảm chữ số sau -Ađể quản lý đúng cách).
Pandya

4

Bạn cũng có thể sử dụng lệnh whereishiệu quả hơn vì nó hiển thị lệnh nằm ở đâu trên máy cũng như thư viện trang thủ công, v.v.


-Xin lỗi vì tiếng Anh của tôi kém, vì tôi mới học và chưa sử dụng tốt lắm! ...
Joke Sr. OK

2

Những người khác đã trả lời về cat, tôi chỉ muốn giải thích vấn đề với echo. Nếu bạn sử dụng -atùy chọn loại (liệt kê tất cả các kết quả khớp), bạn sẽ thấy đó echocả phần dựng sẵn chương trình bên ngoài:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Hai người hoàn toàn độc lập với nhau. typekhông có tùy chọn nào sẽ chỉ trả về lệnh khớp đầu tiên được tìm thấy. Vì vậy, gõ foosẽ cho bạn thấy những gì sẽ được thực hiện nếu bạn chạy foo. Có thể có các tùy chọn khác, nhưng chúng sẽ không được hiển thị trừ khi bạn sử dụng -a.


2

Vì có một số câu trả lời hay ở đây về việc sử dụng kiểu để tìm hiểu xem một lệnh như catlà dựng sẵn hay chương trình bên ngoài. Tôi sẽ có một cách tiếp cận tổng quát hơn. Có một số lệnh phải được xây dựng bởi vì chúng ảnh hưởng đến shell hiện tại. Ba ví dụ cổ điển là cd, exec, và exit. Có một số lệnh không được xây dựng vì chức năng của chúng phụ thuộc vào hành vi của lệnh thực thi hoặc lệnh hệ thống. Ví dụ về các chương trình như vậy bao gồm su, sudo, califesuper. Tất cả các lệnh khác có thể được xây dựng dưới dạng nội trang hoặc chương trình bên ngoài.catlà một chương trình ví dụ tuyệt vời của lớp này vì có các shell bao gồm nó dưới dạng dựng sẵn và các shell không. Điều đáng chú ý là nhiều lệnh của lớp này có sẵn dưới dạng nội trang cũng có sẵn như các chương trình bên ngoài.

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.