Tại sao không tạo tệp .txt thực thi thay vì tệp .sh để chạy tập lệnh?


18

Tôi đã tự hỏi những gì cần thiết để đặt các lệnh thực thi trong một .shtệp để tạo một tập lệnh, vì tôi có thể làm tương tự bằng cách đặt các lệnh bên trong một .txttệp và làm cho nó có thể thực thi được bằng cách sử dụng chmod.

Tôi cho rằng điều này có thể được thực hiện với bất kỳ phần mở rộng tập tin nào. Vì vậy, tôi khá bối rối về sự cần thiết phải .shgia hạn. Bất kì sự trợ giúp nào đều được đánh giá cao.


19
Unix theo truyền thống không quan tâm đến phần mở rộng tập tin. Vì vậy, bạn đã đúng - không thành vấn đề. Nó hoàn toàn làm cho người đọc thấy rõ rằng đó là một kịch bản shell
vidarlo

8
các phần mở rộng tệp trong Linux không được HĐH sử dụng theo bất kỳ cách thực tế nào. Đặt phần mở rộng .sh chỉ đơn thuần cho người dùng biết rằng đó là tập lệnh shell, trái ngược với một số loại tệp khác, như tập lệnh python hoặc perl. Cá nhân, tôi không đặt phần mở rộng vào tập lệnh của mình.
doneal24

2
Chỉ cần nói với bạn hoặc bất kỳ ai khác đang xem đó là kịch bản shell. Nếu bạn không quan tâm đến việc cho biết tập tin .txt nào là tập lệnh sẽ chạy và tập tin nào sẽ được mở trong trình chỉnh sửa, vui lòng đặt tên mọi thứ .txt!
daboross

2
Right.txt, but.txt if.txt every.txt end.txt with.txt the.txt .txt .txthậu tố.txt, you.txt not.txt .txt) Hiểu.txt what.txt every.txt file.txt is.txt there.txt for.txt.
leftaroundabout

1
Điều này tương tự với câu hỏi đây là một bản sao được cho là trùng lặp, nhưng câu hỏi đó không thực sự trả lời câu hỏi này.
Kenny Evitt

Câu trả lời:


47

Không cần phần mở rộng tập tin để khớp với bất cứ điều gì cụ thể, như bạn đã tìm ra chính xác.

Trên các hệ thống giống Unix, các loại tệp thường được lấy từ nội dung của tệp (tức là "số ma thuật" hoặc các cấu trúc đặc trưng khác trong một vài byte đầu tiên) chứ không phải từ tên của chúng. Bạn cũng có thể bỏ hoàn toàn phần mở rộng, thường được thực hiện cho các tệp thực thi.

Kiểm tra filelệnh, nó cho bạn thấy thông tin mà nó có thể tìm hiểu về một loại tệp từ nội dung của nó.

Đối với một tập lệnh thực thi, hệ thống mong đợi cái gọi là "shebang" trong dòng đầu tiên, trông giống như

#!/usr/bin/env python3

và chỉ ra chương trình nào sẽ chạy như trình thông dịch với tệp script làm đối số. Nếu bạn thực thi một tệp văn bản mà không có shebang như vậy, nó sẽ sử dụng shell mặc định của bạn, tức là Bash để thử và giải thích nó.

Vì vậy, trên các hệ thống Unix / Linux, phần mở rộng tên tệp chủ yếu là một gợi ý (nhưng không đảm bảo) để người dùng nhanh chóng nhận ra những gì mong đợi một tệp cụ thể chứa. Đó cũng là một quy ước có thể giúp tìm kiếm các tập tin nhanh hơn.

Lưu ý rằng có một số trường hợp ngoại lệ, trong đó tên và phần mở rộng có vấn đề (ví dụ: một số tệp cấu hình hệ thống phải tuân theo quy ước đặt tên hoặc nhiều trình xem và chỉnh sửa hình ảnh cũng yêu cầu phần mở rộng để chỉ ra loại tệp).

Bạn cũng có thể xem Do phần mở rộng tệp có mục đích gì (đối với hệ điều hành) không?


3
Phần mở rộng tệp không quan trọng trong hệ vỏ, nhưng trong thế giới GUI OS, bạn rất cần chúng để nhấp đúp hoạt động chính xác.
BallpointBen

@BallpointBen hai điểm không liên quan. Ngay cả trong GUI, "loại" của tệp có thể được lưu trữ dọc theo, như một siêu dữ liệu và có thể kích hoạt một thực thi cụ thể, bất kể có phần mở rộng là gì. MacOS không có phần mở rộng tên tệp và là GUI và tồn tại rất tốt ...
Patrick Mevzek

1
@PatrickMevzek làm thế nào để MacOS không có tiện ích mở rộng? Tôi kích hoạt hiển thị chúng và tất cả các tệp có chúng. Tui bỏ lỡ điều gì vậy ? Tôi mới sử dụng nền tảng MacOS
Ciprian Tomoiagă

1
@ CiprianTomoiagă bạn có thể đặt tên cho các tệp của mình theo cách bạn muốn, HĐH không cần tiện ích mở rộng để hoạt động chính xác trên chúng. Xem ví dụ: howtogeek.com/192628/...
Patrick Mevzek

1
@barbiru nhắm mục tiêu mẫu số chung thấp nhất ... điều gì có thể sai với điều đó :-) (như các cuộc tấn công qua các tệp đính kèm email được gọi là Something.com ). Thật vậy, đối với phần mở rộng tập tin khả năng tương tác có thể là một thực hành tốt. Người ta phải học mặc dù đây rõ ràng là một khiếm khuyết được DOS giới thiệu và các hệ điều hành khác nhau hoàn toàn hài lòng với các tệp không có phần mở rộng.
Patrick Mevzek

3

Không có thứ gọi là "phần mở rộng" hay "loại" trong tên tệp UNIX / Linux.

Như những người khác đã chỉ ra, "loại" có thể được tìm thấy bằng cách sử dụng lệnh tập tin giả sử rằng ma thuật có liên quan có sẵn trên hệ thống của bạn. Tên tệp UNIX / Linux thường có thể chứa bất kỳ ký tự nào có sẵn nhưng thường hữu ích khi sử dụng một số dạng quy ước cho tên để cả người và máy có thể đưa ra phán đoán về nội dung (và do đó sử dụng nội dung).

Ví dụ, tôi thường sử dụng dấu phẩy là ký tự đầu tiên của tên tệp để chỉ ra một tệp tạm thời thay vì sử dụng một cái gì đó như chuỗi ".tmp" ở cuối tên tệp. Kết quả là như nhau, một tệp chứa dữ liệu chỉ được yêu cầu trong một thời gian ngắn có lẽ nhưng tên không yêu cầu phải có "." trong đó cũng không phải chuỗi "tmp". Điều này đôi khi có thể có lợi thế, ví dụ như khi phân tích một danh sách các tên tệp. Nhưng đó là quy ước của tôi và người khác có thể quyết định người khác thậm chí sử dụng ".tmp" làm quy ước tên của họ cho một tệp tạm thời.

Vì vậy, câu trả lời của tôi cho bạn là không có phần mở rộng tệp UNIX / Linux mà chỉ là một tập hợp các quy ước thường trông giống như các phần mở rộng tệp được sử dụng trong các hệ điều hành khác và hệ thống tệp của chúng.


FWIW, tôi cũng sử dụng một quy ước không chuẩn cho bản thân mình. Các tập lệnh của tôi có tên bắt đầu bằng "."có nghĩa là được chấm bởi shell (chúng không thể chạy một cách có ý nghĩa trong một lớp con). Tương ứng, tôi vô hiệu hóa quy ước "dấu chấm ban đầu = tệp ẩn" mặc định trong các bí danh / tập lệnh sử dụng lsđể tôi có thể xem tất cả các tệp, bao gồm cả các tệp "ẩn". Tương tự như vậy trên Windows, tôi tắt cài đặt "ẩn phần mở rộng tệp".
jrw32982 hỗ trợ Monica
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.