Tôi có nên đặt phần mở rộng tệp * .sh và * .rb trên tất cả các tập lệnh của mình không?


20

Tôi có một loạt các tập lệnh thực thi được cuộn bằng tay trong thư mục $ HOME / bin của mình. Một số được viết bằng bash, một số bằng Ruby. Tất cả chúng đều có dòng shebang ở trên cùng nói với trình bao sử dụng trình thông dịch nào (bash hoặc Ruby, trong trường hợp của tôi).

Tôi tự hỏi liệu có tốt hơn khi đặt các phần mở rộng tập tin vào các tập lệnh này để cho biết chúng được viết bằng ngôn ngữ kịch bản nào không? Ví dụ: các tập lệnh trong Ruby sẽ có hậu tố * .rb và các tập lệnh bash sẽ có hậu tố * .sh.

Hiện tại, các tập lệnh này chỉ có tên đơn giản không có phần mở rộng tập tin.

Thực hành tốt nhất là gì?


1
Thật dễ dàng để chuyển đổi từ shebang sang phần mở rộng và trở lại với một tập lệnh đơn giản. Vì vậy, hãy thử một và sửa nó sau nếu bạn cần.
Aaron J Lang

Câu trả lời:


9

Bạn có thể thực hiện các lệnh ký tự đại diện như ls *.rbhoặc cp *.shnếu bạn muốn tổ chức các tập lệnh của mình trong tương lai.

Bắt đầu sớm hoặc hối tiếc sau, theo ý kiến ​​của tôi.

Các biên tập viên như thế vimcũng sẽ có thể áp dụng tô sáng cú pháp chính xác dựa trên shebang hoặc phần mở rộng tệp.

Điều này cũng có thể được thực hiện bằng cách sử dụng modelines trong các trình soạn thảo khác nhau. Ví dụ cho vim:

# vim: ft=sh

2
IMHO, tổ chức được thực hiện tốt hơn bởi chức năng, không phải bởi các chi tiết thực hiện.
grawity

4
@grawity: tuy nhiên việc tổ chức bằng hậu tố đơn giản hơn so với grepping cho shebang ...
akira

Mặc dù tôi đồng ý với lý do toàn cầu, hầu hết các biên tập viên đều đủ thông minh để đọc shebang để xác định kiểu tệp.
Rich Homolka

10

Vâng - như hầu hết mọi thứ trong cuộc sống: Nó phụ thuộc vào nhu cầu của bạn.

Bạn đã nói rằng các tập lệnh này nằm trong một thư mục bin và tôi cho rằng các tập lệnh này sẽ được gọi từ dòng lệnh. Là người dùng, tôi coi nó là phiền phức nếu tôi phải gõ bla.ksh hoặc foo.bash. Ngoài ra, nếu người viết quyết định chuyển sang trình thông dịch phiên dịch, tên lệnh cũng sẽ thay đổi và tôi sẽ phải sửa đổi các tập lệnh khác sử dụng các công cụ này - rất khó chịu, ngay cả khi người dùngngười viết là cùng một người.

Nhưng mặt khác, tôi sử dụng các phần mở rộng như .sh hoặc .tcl trong các thư mục xây dựng dự án của tôi. Bằng cách này, tôi có thể sử dụng các tính năng tạo để triển khai các tệp vào thư mục đích của chúng - nhưng ở giai đoạn này tôi loại bỏ hậu tố tệp.


6

Rõ ràng có một số khác biệt giữa các tệp thực thi trong các binthư mục và các tệp "nguồn" có thể chỉnh sửa.

  • Đối với các tệp nguồn, thật hữu ích khi có hậu tố để bạn có thể xem những gì là gì và để giúp một số công cụ kém thông minh không quét được #!dòng.
  • Đối với mô-đun, họ chỉ được sử dụng bởi một bộ có liên quan của chương trình, tất cả đều sử dụng thông dịch viên cùng (hoặc không có thông dịch viên), và nó là truyền thống bao gồm .pm, .shhoặc .sotrong những trường hợp như vậy.
  • Đối với các chương trình thực thi, tên của nó là một phần của "hợp đồng lập trình" mà người dùng và các tập lệnh khác gọi nó. Điều quan trọng là tên không thay đổi ngay cả khi thực hiện; Vì vậy, rõ ràng tên tệp không nên có hậu tố

Trong trường hợp của một chương trình được biên dịch, sự khác biệt giữa "nguồn" và "thực thi" là rõ ràng: một cái chứa mã nguồn, cái kia chứa ngôn ngữ máy hoặc mã byte được giải thích. Trong trường hợp của tập lệnh, không có sự khác biệt rõ ràng, nhưng makelệnh duy trì một sự tách biệt đáng chú ý giữa "mã nguồn cho tập lệnh" và "phiên bản thực thi của tập lệnh": trình biên dịch "mặc định" cho "tập lệnh shell" chỉ đơn giản là cp.

Tôi khuyên bạn nên giữ một $HOME/sourcethư mục riêng và:

  • giữ một liên kết tượng trưng, ​​chẳng hạn như được thực hiện bởi ln -s ../source/foo.sh $HOME/bin/foo; hoặc là
  • tự sao chép chúng sau khi thực hiện các thay đổi (và kiểm tra chúng), bằng cách sử dụng install -m 755 foo.sh ../bin/foo; hoặc là
  • sử dụng Makefilequy tắc để thực hiện kiểm tra cú pháp trước khi sao chép tệp nguồn từ $HOME/sourcevào$HOME/bin

Chú thích: một module shell script là chỉ có thể sử dụng bởi một shell script, và sửa đổi bối cảnh nội bộ của kịch bản đó bằng cách sử dụng .hoặc sourcetích hợp các lệnh. Điều này khác với một tập lệnh thực thi, mà (giống như bất kỳ chương trình nào) chạy như một quy trình riêng biệt và không thể sửa đổi quy trình mẹ của nó. Như một quy ước thô, các mô-đun đi vào trong /usr/lib/name_of_program/name_of_module.shkhi các lệnh đi vào /usr/bin/name_of_command(không có bất kỳ hậu tố nào).


3

Nó không cần thiết. Kernel đã được thông báo về trình thông dịch chính xác để sử dụng (theo #!dòng) và tất cả các trình soạn thảo văn bản phổ biến cũng đọc nó, vì vậy việc thêm một phần mở rộng sẽ không có gì hữu ích, chỉ tăng nhập. Lần duy nhất một chương trình thực thi có phần mở rộng là khi nó quan trọng bằng cách nào đó (đối với chương trình hoặc người dùng hoặc cả hai).


Mặt khác, các mô-đun và thư viện hầu như luôn có các phần mở rộng ( .rbđối với các mô-đun Ruby, .sođối với các thư viện dùng chung ELF, v.v.).


câu hỏi không phải là quá nhiều về 'hạt nhân có thể chạy nó không nếu tôi không cung cấp hậu tố' nhưng về 'nó có giúp tôi không'. tăng ký tự gõ là không liên quan với hoàn thành.
akira
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.