Cám ơn vì tất cả đóng góp. Tôi sẽ cố gắng trả lời câu hỏi của riêng tôi bây giờ và cung cấp một hướng dẫn đầy đủ cho các khả năng khác nhau để thực thi các tập lệnh và nhị phân. Vui lòng chỉnh sửa và nhận xét và chúng tôi sẽ có thể đưa ra một cái gì đó đầy đủ và chính xác. Đây là gợi ý của tôi:
Đầu tiên, hai điểm để nêu:
Linux tạo ra sự khác biệt giữa một lệnh và một đường dẫn . Một lệnh chỉ được gõ như trên dấu nhắc và sẽ thực thi lệnh tích hợp hoặc sẽ khiến Linux tìm kiếm một tệp nhị phân hoặc tập lệnh tương ứng trên $ PATH.
Để Linux diễn giải một cái gì đó như một đường dẫn, nó cần chứa ít nhất một dấu gạch chéo (/). Ví dụ ./myScript
, ./
có vẻ khá dư thừa - chỉ có điều khiến Linux diễn giải nó như một đường dẫn chứ không phải là một lệnh.
Vì vậy, các tùy chọn để thực hiện nhị phân hoặc tập lệnh:
Thực hiện nhị phân binary
:
$ binary # when 'binary' is on the PATH, or is a built-in
$ ./binary # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir
Thực hiện một kịch bản script
:
Các tập tin sẽ phải có quyền thực thi trừ khi có quy định khác.
$ script # execute a script that is on PATH. Will be executed in a new shell.
# The interpreter to use is determined by the she-bang in the file.
$ ./script # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir.
# Otherwise as above.
$ . script # execute a script in the current dir. Will be executed in the
# current shell environment.
$ source script # equivalent to the above *1
$ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...',
# 'zsh ...' etc.). Execute permission not neccessary.
Về cô ấy :
Các tập lệnh có chữ cái (ví dụ #!/bin/sh
) trên dòng đầu tiên cho biết trình thông dịch nào sẽ sử dụng.
- Trình thông dịch này sẽ được sử dụng khi được thực thi bởi
./script
hoặc sử dụng lệnh: script
( script
phải trên PATH)
- Sử dụng
sh script
sẽ bỏ qua cô ấy và sử dụng, trong trường hợp này, sh
là thông dịch viên
- Sử dụng
. script
hoặc source
sẽ bỏ qua cô ấy và sử dụng trình thông dịch hiện tại (vì .
hoặc source
tương đương với việc chỉ thực hiện từng dòng của tập lệnh trong trình bao hiện tại)
Chú thích
* 1: Điều này chỉ gần như đúng. Trong bash chúng thực sự là cùng một lệnh, nhưng khi sử dụng source
, script
sẽ được tìm kiếm trong $ PATH trước thư mục hiện tại. Đó là bash, nhưng trong các vỏ chỉ POSIX, source
không hoạt động, nhưng .
có. Vì vậy, thay vì sử dụng sau này cho tính di động.
* 2: điều thực sự xảy ra là chúng ta chạy sh nhị phân với 'script' làm đối số, điều này sẽ làm cho 'sh' thực thi 'script' trong lớp vỏ mới của nó