Tôi đã thấy câu hỏi này trên trang web này và điều này thôi thúc tôi đặt câu hỏi này. Tôi muốn biết trong Unix nói sự khác biệt giữa tập lệnh thực thi và tập lệnh shell là gì?
Tôi đã thấy câu hỏi này trên trang web này và điều này thôi thúc tôi đặt câu hỏi này. Tôi muốn biết trong Unix nói sự khác biệt giữa tập lệnh thực thi và tập lệnh shell là gì?
Câu trả lời:
Một tệp thực thi đề cập đến bất kỳ tệp nào có tập bit thực thi có thể được thực thi (ngay cả khi có lỗi trong quá trình chạy thực tế của chương trình).
Một kịch bản shell là một loại thực thi cụ thể được dự định sẽ được giải thích bởi một shell bằng cách sử dụng lệnh #!
để chỉ định một trình thông dịch.
Một tập lệnh là một tập tin:
Một kịch bản shell là một kịch bản có trình thông dịch là shell . Trong thế giới unix, vỏ sò, đề cập đến họ vỏ sò giống với vỏ Bourne ; hiện đại như vậy vỏ (tro, bash, ksh, zsh, Nhận) phù hợp với tiêu chuẩn vỏ POSIX . Tổng quát hơn, từ từ shell shell có thể bao gồm các trình thông dịch lệnh khác như csh, tcsh, fish, [
Một tập tin thực thi là bất kỳ tập tin có thể được thực thi. Để có thể thực thi hiệu quả, một tệp cần có hai thuộc tính:
ls -l
: x
ký tự phải có trong cột quyền.Định dạng của tệp phải là định dạng mà hệ thống nhận ra là có thể thực thi được. Các định dạng thực thi có thể được chia thành nhiều loại:
#!
theo sau là một đường dẫn đến một tập tin. Để thực thi một tệp như vậy, kernel thực thi chương trình trình thông dịch và chuyển đường dẫn đến tập lệnh dưới dạng đối số.Lưu ý rằng việc thực thi là phụ thuộc vào hệ thống. Ví dụ, tệp nhị phân amd64 Linux có thể thực thi được trên hệ thống amd64 Linux nhưng không phải trên hệ thống 32 bit. Một nhị phân cho Android không thể thực thi được trên bản cài đặt Linux thông thường. Một tệp thực thi Windows chỉ có thể thực thi được trên Linux nếu có Wine. Một tập lệnh bắt đầu #!/usr/local/bin/ruby
chỉ có thể thực thi được nếu có một chương trình nằm ở đó /usr/local/bin/ruby
.
Một kịch bản shell thường được thực thi. Nhưng nó có thể không được thực thi, nếu bạn không có quyền thực thi nó. Bạn vẫn có thể giải thích nó bằng cách chuyển nó một cách rõ ràng cho trình thông dịch (ví dụ bash /path/to/script
) - Có thể giải thích nó là một cách thú vị để nói rằng
shell-script:
Kịch bản shell là một chuỗi các lệnh sẽ được diễn giải bằng shell (Thường là sh hoặc shell tương thích sh, đôi khi khác).
Tên tập lệnh có thể, nhưng KHÔNG cần, kết thúc bằng ".sh" hoặc ".bash" hoặc ".csh", v.v. (đưa ra gợi ý về trình bao mà nó sẽ được khởi chạy bởi).
Để rõ ràng, tôi sẽ giả sử: tên tập lệnh là script
và trình bao nên được khởi chạy bash
.
Một cách điển hình để khởi chạy nó trong shell sẽ là: bash /absolute/path/to/the/script
hoặc bash ./relative/path/to/the/script
. Theo cách đó, nó không cần phải có tập bit thực thi, vì nó chỉ được đọc bởi bash, sau đó thực thi nội dung.
Nó cũng có thể được đặt + x (có thể thực thi) để cho phép khởi chạy trực tiếp từ phiên shell hiện tại của bạn với: / perfect / path / to / the / script (hoặc ./relative/path/to/the/script). Chú ý: theo mặc định, khi được khởi chạy theo cách đó, nó được khởi chạy thông qua trình bao bạn đã nhập hoặc thông qua trình bao posix (hành vi phụ thuộc vào hệ điều hành), do đó, nó không thể là lớp vỏ mà nó phải chạy. Đó là lý do tại sao bạn có thể (và nên) chỉ định là dòng đầu tiên của tập lệnh: #! / Path / to / good / shell cho biết hệ điều hành của bạn rằng tập lệnh đó thực sự sẽ được khởi chạy bởi / path / to / good / shell.
thực thi:
Tệp thực thi là một tệp có bit "x" được đặt cho người dùng / nhóm (s) mà nó được cho là sẽ được khởi chạy bởi. Nó thường có thể là "nhị phân" hoặc tập lệnh.
Mẹo: file /some/file
có thể cho bạn biết thêm về nội dung của tệp. Hãy thử file /usr/bin/bash
hoặc file /etc/profile
để xem một số ví dụ.