Trong Unix nói sự khác biệt giữa tập lệnh shell và tập tin thực thi là gì?


Câu trả lời:


12

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.


12

Một tập lệnh là một tập tin:

  • có thể đọc được bằng con người (ít nhất là với một người được đào tạo hợp lý, tức là tệp bao gồm các ký tự có thể in được); và
  • được một thông dịch viên hiểu là các hướng dẫn mô tả hành vi của một chương trình.

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:

  • Người dùng phải có quyền để thực hiện nó. Điều này có thể được nhìn thấy bằng lệnh ls -l: xký 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:

    • Các tệp thực thi gốc, bao gồm mã máy được sắp xếp theo bố cục thực thi nhị phân của hệ điều hành. Hầu hết các hệ thống unix hiện đại sử dụng định dạng ELF cho các tệp thực thi riêng của chúng.
    • Chữ viết. Một tập lệnh thực thi là một tập tin bắt đầu bằng một dòng shebang , bao gồm hai ký tự #!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ố.
    • Có thể các định dạng khác tùy thuộc vào hệ thống. Ví dụ: Linux có thể đăng ký các định dạng tệp tùy ý thông qua cơ sở binfmt_misc . Điều này cho phép các tệp mã byte Java được thực thi thông qua một JVM đã đăng ký , các tệp thực thi Windows được thực thi thông qua Wine , v.v.

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/rubychỉ 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


2

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à scriptvà 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/scripthoặ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/filecó thể cho bạn biết thêm về nội dung của tệp. Hãy thử file /usr/bin/bashhoặc file /etc/profileđể xem một số ví dụ.


Tuyên bố của bạn về các tập lệnh shebangless đang được chạy bởi trình bao hiện tại của bạn là không chính xác. Hành vi phụ thuộc vào hệ điều hành. Nói chung, vỏ POSIX hoặc vỏ đăng nhập của bạn được sử dụng.
jlliagre

Cảm ơn sự chính xác này. Tôi sẽ chỉnh sửa câu trả lời của tôi để thêm nhận xét của bạn.
Olivier Dulac
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.