Điểm mấu chốt là đây: Các phần mở rộng không liên quan trong bất kỳ hệ thống giống như Unix. Tên tệp chỉ là tên và không ảnh hưởng đến việc liệu tập lệnh hoặc tệp thực thi được biên dịch có thể chạy hay không . Một lập trình viên có thể thêm một .sh
phần mở rộng để chỉ định rằng một tệp là shell script hoặc .py
cho kịch bản python, nhưng không giống như Windows, bất kỳ unix nào không quan tâm đến việc đặt tên, nó quan tâm đến các quyền.
Vấn đề là sự cho phép thực thi được cấp cho một tập tin. Mà bạn có thể kiểm tra với
ls -l /path/to/file
Chạy thực thi
Để chạy script thường có một số cách.
- Nếu thư mục hiện tại của bạn giống với tập lệnh và tập lệnh có quyền thực thi, bạn có thể chạy nó như vậy
./my_script_name
. Các thư mục .
có nghĩa là hiện tại.
- Nếu thư mục hiện tại của bạn khác và tập lệnh có quyền thực thi, bạn có thể chạy nó bằng cách chỉ định đường dẫn đầy đủ:
/home/user/bin/my_script_name
(Trên đây hai phương pháp dựa vào việc thiết lập sự cho phép thực thi; hay không tập được một phần của $PATH
biến là không liên quan Sự hiện diện của. #!
Dòng cũng có vấn đề; không có nó, nó kịch bản sẽ được thực hiện bằng vỏ hiện tại bạn đã mở Nếu tôi có. csh
Kịch bản không có dòng đó và cố gắng chạy nó trong bash với./my_script.csh
, nó sẽ thất bại)
- Nếu tập lệnh của bạn nằm trong thư mục là một phần của
$PATH
biến, bạn có thể chạy nó chỉ bằng cách gọi tên. Bạn có thể gọi chmod
lệnh trong dòng lệnh chỉ bằng cách gõ tên của nó vì nó nằm trong /bin
thư mục./bin
luôn là một phần của $PATH
biến. Trong trường hợp này, quyền và vị trí của tập lệnh có thể thực thi được
- Chỉ định một trình thông dịch là lệnh và kịch bản làm đối số. Bằng cách đó, script sẽ đóng vai trò là tệp đầu vào cho trình thông dịch.
- Tìm nguồn cung cấp một tập tin. Các
. filename.sh
hoặc source filename.sh
sẽ làm cho kịch bản được đối xử như thể nó là đầu vào bàn phím, ví dụ như nếu nó được gõ vào dòng lệnh trực tiếp. Trong trường hợp này, quyền và vị trí thực thi không thành vấn đề
Ví dụ
Ví dụ # 1, chạy với trình thông dịch, để thực thi quyền
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Ví dụ # 2, chạy với ./
bộ quyền thực thi, bộ dòng shebang.
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Ví dụ # 3, chạy mà không có bộ dòng shebang (không thành công, vì bash không thể đọc tập lệnh python; không có dòng shebang nào giả định trình bao hiện tại làm trình thông dịch)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Ví dụ # 4, tập lệnh đang chạy có quyền thực thi đặt thư mục biểu mẫu là một phần của $PATH
biến
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
Ví dụ # 5, xóa tiện ích mở rộng, vẫn chạy vì tiện ích mở rộng không quan trọng, nhưng nó có quyền và là một phần của $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.sh
như một tiện ích mở rộng trong nhiều trường hợp được coi là thực tiễn xấu: Nó trái với cách các lệnh khác được đặt tên (bạn không chạyls.elf
), nó thường gây hiểu lầm (nếu bạnfoo.sh
bắt đầu với#!/bin/bash
, thì chạysh foo.sh
sẽ chạy nó với một trình thông dịch khác với nó được tạo cho ) và nếu bạn viết lạifoo.sh
thành chương trình Python, sử dụng tiện ích mở rộng đó có nghĩa là bạn cần chọn giữa việc giữ tên gây hiểu lầm và viết lại mọi chương trình gọi nó.