Phần mở rộng tệp cho tập lệnh shell unix [đã đóng]


45

Trên wikipedia, bài viết cho .sh nói:

Đối với loại phần mở rộng tệp .sh, xem shell Bourne .

Làm thế nào về vỏ unix khác?

Tôi biết rằng shebang được sử dụng bên trong tệp để chỉ ra một trình thông dịch để thực thi, nhưng tôi tự hỏi:

  • Những ưu và nhược điểm của phần mở rộng tập tin so với phần mở rộng tập tin là gì?

4
Đôi khi, các kịch bản shell không có shebang (hoặc không có quyền exec) có thể được tìm thấy. Trong trường hợp đó, một tên kết thúc bằng .sh có thể là một gợi ý cho người dùng để chạy chúng với bash script.sh(hoặc sh, tất nhiên).
Ansgar Esztermann

3
Nếu một tập lệnh shell có phần mở rộng thì nó thường là .sh. Tôi chưa bao giờ thấy một tập lệnh .ksh hoặc .bash. Hầu hết các tập lệnh shell không có phần mở rộng, như tất cả các tập lệnh trong /etc/init.d/* làm ví dụ.
Richard Holloway

Trong khi một kết luận đơn giản (có hoặc không) là ý kiến, những điều cần xem xét là không.
ctrl-alt-delor

Câu trả lời:


35

Tôi sẽ chỉ gọi .shmột cái gì đó có nghĩa là di động (và hy vọng di động).

Mặt khác, tôi nghĩ sẽ tốt hơn để che giấu ngôn ngữ. Người đọc cẩn thận sẽ tìm thấy nó trong dòng shebang nào. (Trong thực tế, .bashhoặc .zsh, v.v ... hậu tố hiếm khi được sử dụng.)


1
Chỉ từ trang này, chúng ta đã có thể thấy khá nhiều người sử dụng nó. Tại sao bạn nói rằng chúng "hiếm khi được sử dụng"? Bất kỳ trích dẫn? Hay điều này chỉ đơn thuần dựa trên kinh nghiệm của bạn?
Pacerier

23

Tôi sẽ nói rằng không có "thực hành tốt" nào cho các phần mở rộng tệp tồn tại, hoàn toàn dựa trên tính kỹ thuật: các hệ thống tệp Unix / Linux / * BSD không hỗ trợ các phần mở rộng mỗi se. Những gì bạn đang gọi một phần mở rộng chỉ là một hậu tố của một tên tệp duy nhất. Điều đó khác với các hệ thống và hệ điều hành tệp VM / CMS, VMS, MS-DOS và Windows trong đó một điểm đặc biệt trong tương đương inode-moral được dành cho một phần mở rộng.

Bây giờ, tôi nghĩ rằng nó hơi ngớ ngẩn khi đặt hậu tố ".sh" hoặc ".ksh" hoặc ".bash" trên tên tệp shell script. Một chương trình là một chương trình: không có lợi ích nào trong việc phân biệt những gì được thực thi. Không có unix hoặc linux hoặc bất kỳ kernel nào đã quyết định gọi một trình thông dịch trên một số tệp chỉ vì một hậu tố tên tệp. Tất cả được thực hiện bởi #!dòng hoặc một số byte "số ma thuật" khác ở đầu tệp. Trong thực tế, quyết định những gì sẽ thực thi dựa trên tên tệp "phần mở rộng" là một trong những yếu tố khiến Windows trở thành một nam châm phần mềm độc hại. Hãy xem có bao nhiêu trò gian lận phần mềm độc hại của Windows liên quan đến một tệp có tên "Something.jpg.exe" - theo mặc định, Windows mới hơn không hiển thị tiện ích mở rộng ".exe" và khuyến khích người dùng chỉ cần nhấp đúp vào "

Những gì bạn có thể nghĩ về như một lệnh thẳng tiến thường là một kịch bản shell. Đôi khi ccđã là một kịch bản sh, firefoxlà một kịch bản sh, startxlà một kịch bản sh. Tôi không tin rằng có một lợi ích về nhận thức hoặc tổ chức để đánh dấu một tập lệnh bằng hậu tố ".sh".


24
Tôi không đồng ý! Công việc của tôi bao gồm đóng gói một ứng dụng bao gồm hàng ngàn tệp từ thực thi nhị phân đến các tập lệnh shell (ksh, bash và một số csh kế thừa). Đối với tôi, tin tôi đi, nó sẽ tạo ra sự khác biệt để có thể biết trong nháy mắt (hoặc trong một regex) loại tệp chúng ta đang thảo luận và chúng tôi đang tìm kiếm. Quan điểm của tôi là có thể có một lợi ích trong việc phân biệt những gì bị loại bỏ và một thực tiễn tốt nhất nên khuyến khích nêu rõ loại tập tin.
rahmu

4
@rahmu: viết nó lên như một câu trả lời. Cung cấp một số chi tiết cụ thể về cách các tên có thể phân biệt regex giúp bạn đóng gói (và có thể duy trì) ứng dụng đó. Lưu ý cụ thể sự tương tác giữa những gì diễn giải tệp và hậu tố của tên tệp và cách thức hỗ trợ bạn thực hiện các tác vụ. Tôi quan tâm đến những tranh luận nghiêm túc chống lại quan điểm của tôi và tôi sẵn sàng thay đổi nếu tôi bị thuyết phục. Tôi nêu lên nhận xét của bạn để chứng minh điều đó.
Bruce Ediger

3
Tôi rất thích, thật không may, tôi chỉ có thể nói về kinh nghiệm hiện tại của tôi trong công việc hiện tại của tôi. Tôi không biết nhiều về thực hành tốt và các tiêu chuẩn nói chung ; Tôi cảm thấy tôi nên làm một số nghiên cứu trước khi đăng một câu trả lời ở đây. Tôi sẽ xem xét nó tối nay sau khi làm việc :)
rahmu

2
@rahmu Lệnh "file" tồn tại để xác định loại tệp. Nó có khả năng phân biệt các tập lệnh được viết cho các shell khác nhau.
Matt

3
Nếu bạn cung cấp một tập lệnh shell, một .shphần mở rộng, bạn sẽ phải nhập nó .shnhư một phần của tên lệnh khi bắt đầu nó. Đó là lý do chính tại sao tôi không thích đưa tiện ích mở rộng đó vào (giống với bất kỳ thứ gì có dòng shebang). BTW, vấn đề trong Windows không phải là .exetiền tố (vì nó không quan trọng để tạo ra một tệp thực thi có tên image.jpgtrong Linux), nhưng thực tế là Windows thường che giấu phần mở rộng đó, kết hợp với thực tế là hành động cần thiết để bắt đầu thực thi và để mở một tài liệu là hoàn toàn giống nhau.
celtschk

12

Là một người đã làm việc trong vô số môi trường, tôi đã phải viết rất nhiều loại vỏ. Tin hay không, trên các nền tảng, vỏ không giống nhau. Vì vậy, nếu bạn duy trì thư viện cá nhân của mình trong nhiều shell (khi cần thiết), sẽ rất hữu ích khi sử dụng các tiện ích mở rộng để ID các shell. Theo cách đó, khi bạn chuyển sang nền tảng khác và trình bao hơi khác nhau, bạn sẽ biết tập lệnh nào cần nhắm mục tiêu để sửa đổi. .sh .ksh .bsh .csh ...


Điều này dường như đồng ý với unix.stackexchange.com/questions/31760/iêu
Pacerier

Bạn không có một #!đoạn đầu của kịch bản (ví dụ #!/bin/bash)?
ctrl-alt-delor

Gnu / Linux, BSD và UNIX đều là Unix. Không cần? Nix. Linux là một hạt nhân, Android đã sử dụng Linux nhưng không phải là Unix (trừ khi bạn thêm phần mềm bổ sung, trong trường hợp đó bạn có ứng dụng Unix).
ctrl-alt-delor

@ ctrl-alt-delor: "Unix" là nhãn hiệu . Mọi người thường sử dụng "? Nix" để tránh vấn đề nhãn hiệu (và người bán hàng).
JS.

@JS `UNIX 'là nhãn hiệu của Nhóm mở. Unix và unix không phải là g Greens.org/about/unix.html
ctrl-alt-delor

6

Bạn không nên sử dụng một phần mở rộng cho các tệp thực thi, vì chúng không thể thay thế cho nhau. Hãy tưởng tượng rằng bạn có một tập lệnh shell a.sh, sau đó viết lại bằng python a.py, bây giờ bạn phải thay đổi mọi chương trình gọi cho tập lệnh của bạn, bạn đã bị rò rỉ chi tiết thực hiện.

Toàn bộ phần mở rộng tên tệp trong Windows của Mircosoft là một mớ hỗn độn: ví dụ: những gì có thể đã a.audio, b.audio, c.audio, đang a.mp3, b.wav, c.oggd.picture, e.picture, f.pictured.jpeg, e.png, f.gif. Hầu hết thời gian chúng tôi không quan tâm định dạng âm thanh hoặc hình ảnh là gì. Chúng tôi cũng phải dành thời gian dài để dạy người dùng mới tất cả các phần mở rộng tệp.


Một lý do khác để không sử dụng *.shmà tôi vừa gặp phải là Debian run-partssẽ không chạy các tập lệnh có phần mở rộng, chẳng hạn như trong /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Ross Patterson

5

Như bạn đã nói, phần mở rộng tệp Unix hoàn toàn là thông tin. Bạn chỉ cần kịch bản của bạn để có một shebang chính xác và có thể thực thi được.

Bạn có thể không có phần mở rộng hoặc sử dụng .sh.

Tôi cá nhân sử dụng các quy ước sau, bất kể vỏ được sử dụng (csh, tcsh, bash, sh, ...):

  • không có phần mở rộng cho hệ thống hoặc tập lệnh cao cấp (cực kỳ hiếm).
  • các .shkịch bản cổ điển, thấp đến cao cấp.

Bạn có ý nghĩa gì bởi "các kịch bản cổ điển, từ thấp đến cao cấp"?
Pacerier

Tôi nghĩ rằng tôi có nghĩa là trừu tượng hoặc cấp độ tổ chức bằng cách đó. Đó là bạn không quan tâm công cụ ngôn ngữ / tập lệnh nào được sử dụng đằng sau một số lệnh: vì vậy bạn không sử dụng bất kỳ tiện ích mở rộng nào. Đối với những người khác, thật tốt khi biết rằng đó là một bash hoặc một tập lệnh shell ksh kỳ lạ (với phần mở rộng thích hợp). ... nhưng đó là 2 năm trước;)
Ouki

3

Phần mở rộng tập lệnh Shell khá hữu ích. Ví dụ: tôi thường viết các tập lệnh có nhiều tệp bằng nhiều ngôn ngữ (ví dụ: bash, awk và lua) trong cùng một thư mục. Nếu tôi cần tìm kiếm một chuỗi chỉ trong các tệp bash, thì phần mở rộng làm cho điều này rất tiện dụng, để giảm các lỗi tích cực. Hoặc nếu tôi muốn thực hiện đếm số dòng bash của mình cho dự án đó.

Thật khó khăn khi phải gõ tiện ích mở rộng khi chạy chương trình, vì vậy tôi cũng tạo một liên kết tượng trưng mà không có tiện ích mở rộng để thực thi chính, để chỉnh sửa / chạy nó mà không cần phải nhập tiện ích mở rộng mỗi lần. Symlinks là giá rẻ và dễ dàng.


Điều này dường như đồng ý với unix.stackexchange.com/questions/31760/iêu
Pacerier

2

Như những người khác đã nói, shell không quan tâm đến các phần mở rộng. Tuy nhiên, nó cho phép xác định nhanh chóng các tập tin của con người. Tôi thấy các tệp kết thúc bằng .pyhoặc .shvà tôi nhanh chóng biết chúng (ít nhất) nên là gì. Như Steve nói, tìm kiếm bằng cách mở rộng tập tin hoặc đếm số dòng cũng là những cân nhắc thực tế.

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.