Lệnh vs chương trình?


19

Tôi đã tìm kiếm sự khác biệt giữa adduseruseradd, và một lời giải thích là đó useraddlà một lệnh trong khi adduserlà một tập lệnh perl. Tôi hiểu kịch bản perl là gì, nhưng điều tôi không hiểu commandchính xác là gì.

Tôi luôn luôn nghĩ rằng lệnh thích ls, ln, cdvv là tất cả các chương trình đơn giản viết bằng bất cứ ngôn ngữ mà chỉ đơn giản làm một việc. Sự khác biệt giữa các "chương trình đơn giản" và tập lệnh perl là gì?

Tất nhiên tôi biết rằng một tập lệnh (perl) không được biên dịch nhưng được giải thích trong thời gian chạy, nhưng tôi đoán đó không phải là sự khác biệt duy nhất?


1
không tập trung quá nhiều vào biên dịch so với giải thích trong trường hợp này. bạn có thể có một vỏ được giải thích (mặc dù lý do tại sao bạn muốn một cái là nghi vấn). thay vào đó tập trung vào thực tế là mã cho một hành động lệnh là một phần tĩnh của mã nguồn của shell, trong khi tập lệnh là bên ngoài, không nên được giả sử tồn tại hoặc hành xử giống hệt nhau trên hai hệ thống hơi khác nhau và có thể thậm chí không nhất thiết phải có tất cả các phụ thuộc của nó được đáp ứng. các tập lệnh linh hoạt hơn, và vì lý do đó, nói chung ít đáng tin cậy hơn, trong khi một lệnh sẽ hoạt động ở bất cứ nơi nào shell sẽ.
Frank Thomas

Nói một cách đơn giản: lệnh là bất cứ thứ gì có thể thực thi trong khi chương trình là nhị phân có thể thực thi.
Pithikos

Câu trả lời:


32

Nói một cách đơn giản, một lệnh là một lệnh (hoặc một bộ hướng dẫn) được thực hiện bởi máy tính.

Các lệnh độc lập

Các tiện ích Unix cơ bản như ls, lnv.v. (thường) được viết bằng C và được biên dịch thành các chương trình thực thi độc lập không yêu cầu trình thông dịch phải được thực thi; họ thường yêu cầu một số tệp thư viện nhất định được cài đặt trên hệ thống nhưng đó là câu trả lời cho một câu hỏi khác.

Chữ viết

Một kịch bản là một tập hợp các lệnh và trên thực tế, chính các kịch bản được coi là một lệnh.

Một Perl script là một chuỗi các câu lệnh Perl và đòi hỏi một perl(độc lập và biên soạn) thực thi chương trình để giải thích những điều khoản Perl.

Đôi khi các tập lệnh diễn giải lớn và phức tạp (bằng các ngôn ngữ như Perl, Python và Ruby) cũng được gọi là các chương trình diễn giải trong khi tập lệnh hạn được dành cho các tập lệnh ngắn hơn và đơn giản hơn.

Tập lệnh shell là một chuỗi các lệnh khác (bất kỳ loại lệnh nào) và nó yêu cầu trình bao Unix như Bash để diễn giải tập lệnh. Từ trang Bash man:

Bash là một trình thông dịch ngôn ngữ lệnh tương thích sh thực thi các lệnh được đọc từ đầu vào tiêu chuẩn hoặc từ một tệp.

Shell tích hợp

Shell thường có các lệnh dựng sẵn không phải là chương trình độc lập hay kịch bản. Thay vào đó, chúng là một phần của vỏ và chạy trực tiếp bởi vỏ. cdlà một ví dụ về lệnh tích hợp như vậy.

Đôi khi có các lệnh tồn tại dưới dạng shell dựng sẵn và dưới dạng các lệnh độc lập cùng một lúc, ví dụ: echolệnh.

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

echo trên chính nó thực thi shell được tích hợp trong khi lệnh độc lập có thể được thực thi bằng cách cung cấp đường dẫn đầy đủ của nó.

Chạy phiên bản tích hợp của echo:

$ echo --version
--version

Chạy echochương trình độc lập :

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Lưu ý: Các chi tiết cụ thể ở trên đề cập đến một môi trường Unix nhưng các nguyên tắc tương tự áp dụng cho môi trường Windows.


Tiếng vang bạn đề cập đến trong windows chỉ khi bạn cài đặt Cygwin. Bạn sẽ không tìm thấy tiếng vang. * Trong các cửa sổ vì đó hoàn toàn là lệnh shell của CMD (echo trong powershell được đặt bí danh cho đối tượng ghi)
Jim B

@JimB Đó là sự thật. Tôi chỉnh sửa dòng cuối cùng để làm rõ những gì tôi có ý nghĩa. Thật trùng hợp, tôi chỉ mới bắt đầu học PowerShell trong tuần này (may mắn thay, tôi đã không phải làm việc với .batcác tệp trong nhiều, nhiều năm).
Anthony G - công lý cho Monica

2

Một lệnh tích hợp là một phần của shell. Một chương trình được thực thi bởi shell.

Các lệnh dựng sẵn được chứa trong chính shell. Khi tên của lệnh dựng sẵn được sử dụng làm từ đầu tiên của lệnh đơn giản (xem Lệnh đơn giản ), shell sẽ thực thi lệnh trực tiếp mà không cần gọi chương trình khác. Các lệnh dựng sẵn là cần thiết để thực hiện chức năng không thể hoặc bất tiện để có được với các tiện ích riêng biệt.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands


Nhưng useraddkhông phải là một vỏ tích hợp. Trang web chỉ nói "lệnh", không phải "lệnh tích hợp". Làm thế nào là giải thích này có liên quan đến câu hỏi này?
Barmar

1

Lệnh chỉ có nghĩa là một cách để nói với một ứng dụng hoặc hệ thống để làm một cái gì đó.

Một ứng dụng thường sẽ chấp nhận nhiều lệnh khác nhau, từ GUI, từ stdin, nhưng các phương thức khác là có thể, ví dụ như một ổ cắm UNIX hoặc ống có tên, một số loại API web, kết nối RPC hoặc một số giao thức tùy chỉnh khác.

Một ứng dụng chỉ thực hiện một điều, sau đó thoát, thường không có GUI, cũng có thể được gọi là lệnh, bởi vì bạn thực sự chỉ có thể "cung cấp" cho ứng dụng này một lệnh "có ý nghĩa". Đây là cách các chương trình nhỏ như thế lsvà hoạt động như vậy và tại sao chúng được gọi là các lệnh.

Nhưng bạn sẽ không gọi Photoshop là một lệnh, nhưng bạn chắc chắn sẽ đưa ra các lệnh trong đó thông qua GUI.

Tuy nhiên, thuật ngữ này có thể có nghĩa là những điều khác nhau cho những người khác nhau. Trong ví dụ của bạn, lệnh đang được sử dụng để mô tả một tệp thực thi được chạy trực tiếp, so với tệp yêu cầu trình thông dịch tập lệnh hoạt động. Sự khác biệt có thể quan trọng bởi vì khi bạn đang chạy tập lệnh Perl, /usr/bin/perllà tệp nhị phân thực sự đang chạy (vì vậy nếu bạn muốn giết tập lệnh Perl chạy dài, đó là thứ bạn phải tìm ps). Tuy nhiên, hầu hết các shell đều có các lệnh "tích hợp" là các lệnh cho chính shell và không gây ra một lệnh thực thi bên ngoài để chạy. Ví dụ, cdđược xử lý bởi bashchính nó và nó không gọi /sbin/cdhoặc tương tự.


Quan điểm thú vị. Ở mức độ trừu tượng mà bạn đang xem từ này, tôi muốn gọi nó là 'lời cầu khẩn' hoặc 'cử chỉ' hoặc thậm chí đi theo thuật ngữ Android là 'ý định'. Điều đó nói rằng tôi không biết nếu tôi thích ý tưởng làm cho biên dịch so với giải thích một tiêu chí. Ví dụ, Powershell là phiên dịch lai (, Net), nhưng là một hệ vỏ, nó có các lệnh trong cơ sở mã của nó. nhưng sau đó bạn làm cho một điểm tốt về các tệp thực thi được biên dịch bên ngoài (mã máy) khác với các tập lệnh, nhưng cũng có các lệnh. Như tôi đã nói, quan điểm thú vị.
Frank Thomas
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.