2012-01-29 19 views
16

Tôi biết rằng trong đầu của kịch bản bash sh làCó nghĩa là gì trong các tập lệnh linux? #!/Usr/bin/python -tT

#!/bin/bash 

mà chỉ vào lệnh interpeter thực thi.

Nhưng trong xem Google Python Lớp http://www.youtube.com/watch?v=tKTZoB2Vjuk tôi nhận thấy rằng cho python họ sử dụng

#!/usr/bin/python -tt 

. Lướt Internet Tôi cũng đã tìm thấy phong cách đó của ký hiệu này:

#!/usr/local/bin/python 

và thậm chí

#!/usr/bin/env python 

.

Vì vậy, tôi mới với Python và tôi thường sử dụng Linux và tôi có một vài câu hỏi về vấn đề này "ma thuật" dòng:

  1. Trước hết, hình thức bên phải của dòng này là gì ? và tại sao?
  2. Phím -tt có nghĩa là gì trong #!/Usr/bin/python -tt?
  3. Chương trình nào đang phân tích cú pháp dòng này trong Linux?
  4. Cú pháp của dòng này cho bất kỳ tập lệnh nào?
  5. Tại sao dòng này quá cần thiết nếu mỗi tệp có phần mở rộng của nó?
  6. Và điều gì về điều đó trong mỗi thông dịch viên máy tính đối với một số loại tập lệnh sẽ được lưu trữ ở nơi khác với nơi khác? Và không thể chạy tập lệnh.

Điều đó thực sự thú vị đối với tôi. Dòng này là gì? Tại sao lại là dòng này? Làm thế nào để viết dòng này? Tại sao theo cách như vậy ...

Trả lời

15

Câu hỏi số 1) Dòng này được gọi là shebang và không có biểu mẫu nào hoạt động phổ biến. ví dụ.

#!python 
#!/usr/bin/python 
#!/usr/local/bin/python 
#!/usr/bin/python -t 

là mọi hình thức hợp lệ/chấp nhận được, nhưng có thể không hoạt động trên tất cả các hệ thống:

#!python sẽ chỉ làm việc nếu python thực thi là ở đâu đó trong PATH của shell của bạn

#!/usr/bin/python chỉ hoạt động nếu python nhị phân thực sự nằm trong/usr/bin

#!/usr/local/bin/python cũng chỉ hoạt động nếu python nằm trong/usr/local/bin

Câu hỏi # 2)

#!/usr/bin/python -tt được đi qua các tùy chọn -tt để trăn, như nếu bạn muốn thực hiện:

$ python -t somescript.py 

tại dấu nhắc shell. Bạn có thể chuyển các đối số dòng lệnh đơn phương tới trình thông dịch trên dòng shebang.

Câu hỏi # 3)

Dòng được giải thích bởi hạt nhân hệ điều hành và vỏ bạn đang sử dụng. Các công cụ sau khi #! chỉ cho hệ điều hành biết chương trình nào sẽ được kích hoạt để "thực hiện" phần còn lại của tập lệnh.

Câu hỏi số 4)

Cú pháp tập lệnh tùy thuộc vào ngôn ngữ bạn đang sử dụng. Ví dụ. một kịch bản PHP shell phải mang hình thức của

#!/usr/bin/php 
<?php 
    ... php code here ... 

Một kịch bản #!/usr/bin/perl perl phải sử dụng cú pháp Perl, vv ... Nếu bạn đặt mã PHP với một công việc Perl, bạn sẽ chỉ phải Perl barf lên kịch bản với lỗi cú pháp, như PHP code đang kHÔNG perl đang

Câu hỏi # 5)

Shebangs là cho các hệ thống Unix, nơi mở rộng tập tin không bao giờ thực sự sử dụng để xác định các loại tập tin cho hệ điều hành. Tệp .c được hiểu là tệp mã nguồn ngôn ngữ C, nhưng đó chỉ là một quy ước. Bạn có thể đặt một kịch bản lệnh shell Bash vào một tệp .c, làm cho tệp có thể thực thi được, và với shebang #!/bin/bash, nó sẽ thực thi như một tập lệnh Bash.

Việc xác định các loại thực thi theo phần mở rộng tệp là nhiều thứ trong Windows.

Câu hỏi # 6)

Đó quay ngược lại những thứ trong câu hỏi # 1 - nếu công việc tuyên bố người phiên dịch là tại một số con đường khác hơn là nó ở đâu, kịch bản này đặc biệt không thể được thực hiện cho đến khi công việc là cố định, hoặc thông dịch viên được di chuyển. Shebang rất tiện dụng nhưng không thể sai được.

Rất may, hầu hết các thông dịch viên được cài đặt tại các địa điểm khá chuẩn những ngày này, vì vậy nó muốn được một chút bất thường để tìm (nói) Perl lắp đặt tại /some/wonky/weird/path thay vì /usr/bin

+0

bạn bỏ qua '#!/Usr/bin/env python' thay thế trong danh sách điểm 1. Một số lý do đặc biệt? – joaquin

+0

vòng, bỏ lỡ một. 'env' là một ứng dụng unix in otu các giá trị/giá trị môi trường hiện tại. trên hầu hết các shell, bạn có thể thực hiện 'SOMEVAR = value name_of_app' để định nghĩa một env var (s) cần có trong môi trường ứng dụng đó. làm '/ usr/bin/env python' chỉ buộc tất cả các biến môi trường hiện tại có mặt trong python's. –

+0

Xem câu trả lời của shadyabhi cho "-tt". –

6

Từ manpage:

-t Issue một cảnh báo khi một tập tin nguồn pha trộn các tab và không gian cho indentation theo một cách mà làm cho nó phụ thuộc vào giá trị của một tab được biểu thị bằng dấu cách. Phát hành một lỗi khi tùy chọn được cung cấp hai lần.

  1. Mẫu bên phải của dòng là hình bạn muốn sử dụng.
  2. Đó là thông dịch viên đọc dòng này có tên là shebang. Nếu bạn viết một kịch bản python với dòng đầu tiên là "#!/Usr/bin/python" & gọi nó bằng cách sử dụng bash, đó là trình thông dịch/bin/sh đọc dòng đầu tiên và bắt đầu trình thông dịch thích hợp.
  3. Đó là một shebang. Cú pháp của đối tượng địa lý bao gồm chuỗi ký tự # !, tức là ký hiệu số và ký tự dấu chấm than
  4. Tiện ích mở rộng tệp không có liên quan trong linux thường là. Bạn có thể có một tập lệnh python không có phần mở rộng .py.

Ví dụ:

[email protected] ~ $ cat a 
print "Hello World" 
[email protected] ~ $ python2 a 
Hello World 
[email protected] ~ $ 

Ngay cả các shebang chỉ cần thiết nếu bạn muốn bắt đầu tập lệnh bằng $./Script như trong trường hợp này bạn không đề cập đến trình thông dịch bạn muốn sử dụng.

1
  1. #!/Usr/bin/env python
  2. lỗi vấn đề về việc sử dụng không phù hợp tab
  3. Kernel
  4. #!/path_to_the_interpreter hoặc/usr/bin/env
  5. * nix không kiểm tra extensinon một t tất cả (ngoại trừ một số DE có thể làm điều đó)
  6. Đây là lý do tại sao bạn nên sử dụng #!/usr/bin/env

Thông tin thêm tại wiki

+0

'#!/Usr/bin/env python' không cho phép bạn chuyển tùy chọn' -tt' (hoặc bất kỳ tùy chọn nào khác) cho trình thông dịch python. Xem thêm [câu hỏi này] (http://unix.stackexchange.com/q/29608/10454) và [câu trả lời này] (http://unix.stackexchange.com/a/29620/10454). –

+0

@KeithThompson thực sự không chính xác: sử dụng '#!/Usr/bin/env python -tt' hoạt động và thực hiện chính xác những gì được yêu cầu: chạy trình thông dịch' python' được tìm thấy đầu tiên trong 'PATH' với tùy chọn' -tt' , theo sau là tập lệnh được đề cập. –

+0

@JonathanCallen: Không có trên hệ thống của tôi (Ubuntu 11.04); Tôi nhận được '/ usr/bin/env: python -tt: Không có tệp hoặc thư mục nào'. Trên Solaris 9, nó gọi script bằng 'python', nhưng nó dường như bỏ qua' -tt'. Bạn đang sử dụng hệ thống nào? –

0

Các đường dẫn khác nhau đang ở đến nơi người phiên dịch python đã được cài đặt. Các hương vị khác nhau của Linux cài đặt nó ở những nơi khác nhau.

Linux không quan tâm đến tiện ích mở rộng là điều Windows.

Phiên bash sử dụng dòng để gọi trình thông dịch chính xác cho tập lệnh bạn đang chạy.

Các vị trí khác nhau để lưu trữ, gọi và sử dụng tệp ở tất cả các vị trí được xác định nơi tệp và phần mềm được định vị. Dev cho các thiết bị, nhà cho khu vực lưu trữ của người dùng, bin cho các chương trình. Nhưng khi thời gian trôi qua, các hệ thống khác nhau yêu cầu các vị trí khác nhau.

Tôi khuyên bạn nên mua sách trên Linux/Unix và tìm hiểu kiến ​​thức cơ bản về hệ thống tệp. Nó giúp ích rất nhiều.

-1

Điều này được gọi là shebang. Nó cho hệ thống biết rằng nó sẽ truyền tệp như một đối số cho chương trình được chỉ định thay vì cố gắng thực hiện nó cho mỗi lần truy cập.

Trước hết, biểu mẫu phù hợp của dòng này là gì? và tại sao?

Đường dẫn chính xác là bất cứ nơi nào trình thông dịch python của bạn được cài đặt. Các đối số (-tt) sẽ phụ thuộc vào những gì bạn muốn. Một số người khăng khăng đòi hỏi #!/usr/bin/env trong trường hợp thông dịch viên xảy ra.

Phím -tt có nghĩa là gì trong #!/Usr/bin/python -tt?

Tôi không sử dụng python, vì vậy người khác sẽ phải trả lời câu hỏi này.

Khi tôi khởi chạy bất kỳ tập lệnh nào trong Linux (không phải tập lệnh Python chính xác) chương trình nào phân tích cú pháp và sử dụng dòng này? Tôi nghĩ rằng nó không phải là bash bởi vì ngay cả đối với kịch bản bash dòng này là cần thiết.

Tôi đã nghe (và chắc chắn) đó là hạt nhân. Ngay cả khi nó đã được bash, nó sẽ cần dòng để nói bash nó được coi là một kịch bản nó nên giải thích thay vì đi qua một chương trình khác. /usr/bin/env là lệnh tìm kiếm PATH đối số được chỉ định và chuyển tập lệnh thông qua chương trình mà nó tìm thấy.

Cú pháp của dòng này cho bất kỳ tập lệnh nào? Và tên của interpeter phân tích nó là gì?

Cú pháp là giống như một dòng lệnh, #!command arguments, nhưng command phải có một đường dẫn tuyệt đối, các PATH không được tìm kiếm.

Tại sao dòng này quá cần thiết nếu mỗi tệp có phần mở rộng của nó?

Tiện ích mở rộng có nghĩa là không có gì trong * nix. Tôi có thể đặt tên cho tập lệnh bash script.pl, script.exe hoặc thậm chí script mà không có phần mở rộng. Nếu kịch bản có dòng shebang đúng, nó sẽ được chuyển qua trình thông dịch đúng, nếu không hạt nhân sẽ cố gắng thực thi nó như là một tệp thực thi và không thành công. Hệ thống không biết về tiện ích mở rộng. Họ là một quy ước cho người dùng, không có gì hơn.

Và điều gì về điều đó trong mỗi thông dịch viên máy tính cho một số loại tập lệnh sẽ được lưu trữ ở vị trí khác so với tập lệnh khác? Và không thể chạy tập lệnh.

Nếu tôi hiểu được điều này một cách chính xác, bạn đang nói hệ thống khác nhau/phân phối giữ các thông dịch viên ở những nơi khác nhau (ví dụ /usr/bin/python/usr/local/bin/python), và hỏi làm thế nào hệ thống biết mà sử dụng không?
Câu trả lời là, nó sử dụng một trong đó là ở đường dẫn tuyệt đối bạn đã cho nó. Đây thực sự là một vấn đề nhỏ với các tập lệnh thực thi, và lý do tại sao /usr/bin/env đã trở thành thịnh hành. Như tôi đã nói, env tìm kiếm PATH cho thông dịch viên chính xác, miễn là hệ thống của bạn có /usr/bin/env, bạn đã được thiết lập, bạn không cần tra cứu hoặc đảm bảo vị trí của thông dịch viên.

Các vấn đề liên quan