Sử dụng phần mở rộng .sh hoặc .bash cho tập lệnh bash?


36

(Xem Sử dụng #! / Bin / sh hoặc #! / Bin / bash để tương thích với Ubuntu-OSX và dễ sử dụng & POSIX )

Nếu tôi muốn tập lệnh của mình sử dụng bash shell, thì việc sử dụng phần mở rộng .bash thực sự gọi bash hay nó phụ thuộc vào cấu hình hệ thống / dòng shebang thứ nhất. Nếu cả hai đều có hiệu lực nhưng khác nhau, cái nào sẽ được ưu tiên?

Tôi không chắc có nên kết thúc tập lệnh của mình bằng .sh để chỉ "shell script" hay không và sau đó có dòng đầu tiên chọn bash shell (ví dụ #!/usr/bin/env bash) hoặc có nên kết thúc chúng bằng .bash (cũng như cài đặt dòng 1 không ). Tôi muốn bash được gọi.


3
Tôi không nghĩ rằng tôi đã từng thấy một .bashphần mở rộng. Ngoài ra, chính sách Debian có các tập lệnh trong các gói nằm trong một trong các binthư mục để không có tiện ích mở rộng.
muru

Câu trả lời:


19

không sử dụng phần mở rộng .bash thực sự gọi bash hay nó phụ thuộc vào cấu hình hệ thống / dòng shebang thứ nhất.

Nếu bạn không sử dụng trình thông dịch một cách rõ ràng, thì trình thông dịch được gọi được xác định bởi phần shebangđược sử dụng trong tập lệnh. Nếu bạn sử dụng một trình thông dịch cụ thể thì trình thông dịch không quan tâm bạn mở rộng phần nào cho tập lệnh của mình. Tuy nhiên, phần mở rộng tồn tại để làm cho nó rất rõ ràng đối với những người khác đó là loại kịch bản nào.

[sreeraj@server ~]$ cat ./ext.py
#!/bin/bash
echo "Hi. I am a bash script"

Xem, .pyphần mở rộng cho tập lệnh bash không làm cho tập lệnh python.

[sreeraj@server ~]$ python ./ext.py
  File "./ext.py", line 2
    echo "Hi. I am a bash script"
                                ^
SyntaxError: invalid syntax

Nó luôn luôn là một bashkịch bản.

[sreeraj@server ~]$ ./ext.py
Hi. I am a bash script

23

Việc đặt tên cho kịch bản không liên quan gì đến cách nó chạy.

Dòng shebang định nghĩa trình thông dịch nào được sử dụng để chạy tập lệnh.

Cá nhân tôi không quan tâm nếu một kịch bản là sh, bash, perl, bất cứ điều gì vì vậy tôi chỉ đặt tên cho nó cho những gì nó làm; Tôi tìm thấy thêm một phần mở rộng dự phòng. Tôi sẽ làm gì file scriptnameđể tìm ra tập tin đó là gì nếu tôi muốn biết điều đó.

Vì vậy, nếu bạn muốn tập lệnh của mình được chạy cùng bash, hãy sử dụng #!/bin/bashlàm dòng đầu tiên.


4
Ngoài ra, nếu lựa chọn triển khai cho tập lệnh bao giờ thay đổi (giả sử nó được viết lại bằng Python, Perl, C ...), thì việc không có .shtiện ích mở rộng kiểu có nghĩa là không cần phải đổi tên. (Phải thừa nhận rằng không có gì ngăn cản một chương trình C tạo ra nhị phân có .shphần mở rộng, nó sẽ gây nhầm lẫn.)
Stephen Kitt

2
Sử dụng #!/usr/bin/env bashcho tính di động, được thảo luận ở đây stackoverflow.com/a/10383546/54964
Léo Léopold Hertz

4
@wurtel (bình luận muộn màng, OK?) Thêm một phần mở rộng imho không còn dư thừa. Hầu hết các trình soạn thảo đều hỗ trợ đánh dấu cú pháp dựa trên phần mở rộng, cộng với việc có thể nhìn thấy ngay lập tức loại tệp. Rõ ràng và sẵn sàng vấn đề rất nhiều.
RolfBly

@RolfBly: Các trình soạn thảo tôi sử dụng nhận ra shebang và cung cấp tô sáng cú pháp. Rõ ràng là hữu ích, nhưng hầu hết thời gian chúng tôi muốn thực thi một lệnh và thật tốt nếu tôi phải gõ ít hơn và nếu tôi không phải nhớ ngôn ngữ thực hiện.
Hontvári Levente
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.