Phần mở rộng tập tin có mục đích gì (cho hệ điều hành) không?


73

Linux xác định loại tệp thông qua mã trong tiêu đề tệp. Nó không phụ thuộc vào phần mở rộng tệp để biết phần mềm nào sẽ được sử dụng để mở tệp.

Đó là những gì tôi nhớ từ giáo dục của tôi. Xin hãy sửa tôi trong trường hợp tôi sai!

Làm việc một chút với các hệ thống Ubuntu gần đây: Tôi nhìn thấy rất nhiều các tập tin trên hệ thống mà có phần mở rộng như .sh, .txt, .o,.c

Bây giờ tôi đang tự hỏi: Có phải những phần mở rộng này chỉ dành cho con người? Vì vậy, người ta nên có một ý tưởng đó là loại tập tin gì?

Hay họ cũng có một số mục đích cho hệ điều hành?


5
Nếu bạn không nhận được phản hồi tốt ở đây, hãy nhớ rằng đó cũng là unix.stackexchange.com
mchid

Liên quan, gần như trùng lặp: askubfox.com/questions/390015/ trên
Zzzach ...


5
Trong Windows họ làm, trong Linux / Unix họ hầu như không. Trường hợp ngoại lệ chính là sức nén chương trình - gzip, bzip2, xz- và như vậy. Các chương trình này sử dụng hậu tố để tách phiên bản nén của tệp khỏi tệp không nén mà chúng thay thế. Các chương trình nén thường sẽ phàn nàn về hậu tố không chính xác, mặc dù tệp thực sự là một tệp nén thuộc loại cần xử lý.
Baard Kopperud

6
Tôi nghĩ một phần của vấn đề với câu hỏi này là "hệ điều hành" không phải là một khái niệm được xác định rõ. Một phần của hệ điều hành là gì và một ứng dụng trên nó là gì? Không có nhiều phần của HĐH (bất kỳ HĐH nào chúng ta đang nói đến) quan tâm loại tệp là gì - họ chỉ làm những gì họ được nói. Vì vậy, sự khác biệt về cách họ biết là không liên quan; họ không làm. Mặt khác, ứng dụng cũng có thể làm một hoặc cả hai điều.
IMSoP

Câu trả lời:


39

Linux xác định loại tệp thông qua mã trong tiêu đề tệp. Nó không phụ thuộc vào phần mở rộng tệp để biết với phần mềm là sử dụng để mở tệp.

Đó là những gì tôi nhớ từ giáo dục của tôi. Xin hãy sửa tôi trong trường hợp tôi sai!

  • nhớ chính xác.

Có phải những phần mở rộng này chỉ dành cho con người?

  • Vâng, với một nhưng.

Khi bạn tương tác với các hệ điều hành khác phụ thuộc vào các tiện ích mở rộng là những gì chúng là ý tưởng thông minh hơn để sử dụng chúng.

Trong Windows, phần mềm mở được đính kèm với các phần mở rộng.

Mở một tập tin văn bản có tên là "tập tin" là khó khăn hơn trong Windows vì mở cùng một tập tin có tên là "file.txt" (bạn sẽ cần phải chuyển sang hộp thoại mở tập tin từ *.txtđể *.*mỗi lần). Điều tương tự cũng xảy ra với các tệp văn bản được phân tách bằng TAB và dấu hai chấm. Điều tương tự cũng xảy ra đối với việc nhập và xuất e-mail (phần mở rộng .mbox).

Đặc biệt khi bạn mã phần mềm. Mở một tệp có tên "software1" là tệp HTML và "software2" là tệp JavaScript trở nên khó khăn hơn so với "software.html" và "software.js".


Nếu có một hệ thống sẵn có trong Linux, nơi các phần mở rộng tệp là quan trọng, tôi sẽ gọi đó là một lỗi. Khi phần mềm phụ thuộc vào phần mở rộng tập tin, đó là khai thác. Chúng tôi sử dụng chỉ thị thông dịch để xác định tệp là gì ("hai byte đầu tiên trong tệp có thể là ký tự" #! ", Tạo thành số ma thuật (thập lục phân 23 và 21, các giá trị ASCII của" # "và"! ") thường được gọi là shebang,").

Vấn đề nổi tiếng nhất với phần mở rộng tập tin là LOVE-LETTER-FOR-YOU.TXT.vbs trên Windows. Đây là một kịch bản cơ bản trực quan được hiển thị trong trình duyệt tệp dưới dạng tệp văn bản.

Trong Ubuntu khi bạn bắt đầu một tệp từ Nautilus, bạn sẽ nhận được một cảnh báo về những gì nó sẽ làm. Thực thi một tập lệnh từ Nautilus nơi nó muốn khởi động một số phần mềm có nhiệm vụ mở gEdit rõ ràng là một vấn đề và chúng tôi nhận được cảnh báo về nó.

Trong dòng lệnh khi bạn thực thi một cái gì đó, bạn có thể thấy phần mở rộng là gì. Nếu nó kết thúc trên .vbs tôi sẽ bắt đầu trở nên nghi ngờ (không phải .vbs có thể thực thi được trên Linux. Ít nhất là không phải không có thêm nỗ lực nào;)).


31
Tôi hoàn toàn không hiểu những gì bạn muốn nói trong câu cuối cùng của bạn. Thứ nhất, đó là vấn đề ẩn tiện ích mở rộng thay vì có nó, thứ hai khai thác sẽ hoạt động tương tự trong Linux - bạn đặt tên cho tệp nhị phân readme.txtvà làm cho nó có thể thực thi được. Nếu người dùng thực thi nó, nó không mở trình soạn thảo, mà chạy mã. Về mặt này, việc mở rộng vấn đề (nhưng không che giấu chúng) sẽ an toàn hơn và dễ giải thích hơn cho những người dùng không hiểu biết. Có những khác biệt khác (đáng chú ý nhất là không thực thi các tệp từ thư mục hiện tại), nhưng chúng không liên quan gì đến tiện ích mở rộng.
techraf

4
@techraf Trên thực tế, trình quản lý tệp có thể sẽ cố mở readme.txttệp bằng trình soạn thảo văn bản. Tôi vừa thử với cá heo trong KDE, tạo tập lệnh shell thêm quyền thực thi, lưu nó dưới dạng .txtvà nhấp vào nó sẽ làm cho nó mở trong Kate. Nếu tôi đổi tên nó thành .shthì nhấp vào nó sẽ chạy nó.
Bakuriu

9
linux: vì make được xây dựng xung quanh các quy tắc phụ thuộc vào phần mở rộng tập tin, điều này sẽ không tạo ra (không có ý định chơi chữ) các phần mở rộng có ý nghĩa nhiều hơn chỉ cho con người?
bolov

15
Đây là một câu trả lời sai lầm hoành tráng. Một số phần của Linux sử dụng số ma thuật để xác định loại tệp. Thực hiện các tập tin tại dòng lệnh. Nhưng các phần lớn khác của hệ thống sử dụng các phần mở rộng tệp để biết những gì cần xem, cho dù đó là các trình liên kết động (muốn các tệp .so), modprobe, xây dựng hệ thống, plugin, thư viện cho python, ruby, v.v. t có số ma thuật, filedựa trên heuristic, không xác định.
Alan Shutko

3
"Linux xác định loại tệp thông qua mã trong tiêu đề tệp" "chính xác" WTF? "Mã trong tiêu đề tập tin" là gì? Không có mã như vậy và không có "tiêu đề tệp" chung chung như vậy trong Linux.
leonbloy

68

Không có câu trả lời 100% đen hoặc trắng ở đây.

Thông thường Linux không dựa vào tên tệp (và phần mở rộng tệp, tức là phần của tên tệp sau khoảng thời gian bình thường cuối cùng) và thay vào đó xác định loại tệp bằng cách kiểm tra một vài byte đầu tiên của nội dung và so sánh với danh sách các số ma thuật đã biết .

Ví dụ: tất cả các tệp hình ảnh Bitmap (thường có phần mở rộng tên .bmp) phải bắt đầu bằng các chữ cái BMtrong hai byte đầu tiên của chúng. Các tập lệnh trong hầu hết các ngôn ngữ tập lệnh như Bash, Python, Perl, AWK, v.v. (về cơ bản mọi thứ xử lý các dòng bắt đầu bằng #nhận xét) có thể chứa một shebang như #!/bin/bashdòng đầu tiên. Nhận xét đặc biệt này cho hệ thống biết ứng dụng nào để mở tệp.

Vì vậy, thông thường hệ điều hành phụ thuộc vào nội dung tệp chứ không phải tên của nó để xác định loại tệp, nhưng nói rằng phần mở rộng tệp không bao giờ cần trên Linux chỉ là một nửa sự thật.


Các ứng dụng tất nhiên có thể thực hiện kiểm tra tệp của họ theo cách họ muốn, bao gồm xác minh tên tệp và phần mở rộng. Một ví dụ là Eye of Gnome ( eog, trình xem ảnh tiêu chuẩn) xác định định dạng hình ảnh bằng phần mở rộng tập tin và đưa ra lỗi nếu nó không khớp với nội dung. Cho dù đây là một lỗi hay một tính năng có thể được thảo luận ...

Tuy nhiên, ngay cả một số phần của hệ điều hành cũng dựa vào các phần mở rộng tên tệp, ví dụ như khi phân tích cú pháp các nguồn phần mềm của bạn trong /etc/apt/sources.list.d/- chỉ các tệp có *.listphần mở rộng được phân tích cú pháp, tất cả các phần khác đều bị bỏ qua. Nó có thể không chủ yếu được sử dụng để xác định loại tệp ở đây mà là để bật / tắt phân tích cú pháp một số tệp, nhưng nó vẫn là một phần mở rộng tệp ảnh hưởng đến cách hệ thống xử lý tệp.

Và tất nhiên lợi nhuận sử dụng con người nhất từ phần mở rộng tập tin mà làm cho các loại của một tập tin rõ ràng và cũng cho phép nhiều file với tên cơ sở tương tự và phần mở rộng khác nhau như site.html, site.php, site.js, site.css, vv Những bất lợi là tất nhiên rằng tập tin mở rộng và thực tế loại tập tin / nội dung không nhất thiết phải phù hợp.

Ngoài ra, nó cần thiết cho khả năng tương tác đa nền tảng, ví dụ như Windows sẽ không biết phải làm gì với một readmetệp, nhưng chỉ một readme.txt.


Bạn hơi mâu thuẫn ở đây: nếu trình xem ảnh tiêu chuẩn yêu cầu tên tệp kết thúc .bmp, bạn đang nói phần nào của HĐH dựa trên nội dung tệp bắt đầu "BM"? AFAIK, "số ma thuật duy nhất mà hạt nhân quan tâm là các loại có thể thực thi được, bao gồm cả trường hợp đặc biệt #!. Mọi thứ khác tùy thuộc vào quyết định của ứng dụng.
IMSoP

@IMSoP Tôi không biết cách triển khai chính xác eogvà tôi không biết tại sao họ quan tâm đến tên tệp. Đây là một lỗi trong quan điểm của tôi. Và tất nhiên, nếu tập tin được đặt tên là "bmp" nhưng định dạng nội dung của nó không khớp, tất nhiên cũng sẽ có lỗi. Tất nhiên mỗi ứng dụng quyết định cách xác minh tệp, nhưng nói chung các ứng dụng Linux không nên dựa vào tên. Btw, bạn có thể sử dụng phần filethưởng để kiểm tra các loại tệp theo nội dung của chúng.
Chỉ huy Byte

1
Câu tôi thách thức là: "Linux ... xác định loại tệp bằng cách kiểm tra một vài byte đầu tiên". Định nghĩa của "Linux" bạn đang sử dụng trong câu đó là gì? Sự tồn tại của filetiện ích không thực sự chứng minh bất cứ điều gì; nó là một công cụ hữu ích, có thể tồn tại trên bất kỳ HĐH nào. Phần cơ bản nào của HĐH làm cho việc chạy file"chính xác" hơn so với việc điền tên tệp?
IMSoP

Lưu ý rằng các tệp không có phần mở rộng có thể được liên kết với một chương trình.
isanae

24

Như đã đề cập bởi những người khác, trong Linux, một phương thức chỉ thị trình thông dịch được sử dụng (lưu trữ một số siêu dữ liệu trong tệp dưới dạng tiêu đề hoặc số ma thuật để có thể yêu cầu trình thông dịch chính xác đọc nó) thay vì phương thức liên kết mở rộng tên tệp được sử dụng bởi Windows.

Điều này có nghĩa là bạn có thể tạo một tệp với hầu hết mọi tên bạn thích ... với một vài ngoại lệ

Tuy nhiên

Tôi muốn thêm một lời cảnh báo.

Nếu bạn có một số tệp trên hệ thống của mình từ một hệ thống sử dụng liên kết tên tệp, các tệp đó có thể không có các số ma thuật hoặc tiêu đề đó. Phần mở rộng tên tệp được sử dụng để xác định các tệp này bởi các ứng dụng có thể đọc chúng và bạn có thể gặp một số hiệu ứng không mong muốn nếu bạn đổi tên các tệp đó. Ví dụ:

Nếu bạn đổi tên tệp My Novel.docthành My-Novel, Libreoffice vẫn có thể mở tệp, nhưng nó sẽ mở dưới dạng 'Chưa có tiêu đề' và bạn sẽ phải đặt tên lại để lưu tệp (Libreoffice thêm tiện ích mở rộng theo mặc định, do đó bạn sẽ có hai tập tin My-NovelMy-Novel.odt, có thể gây phiền nhiễu)

Nghiêm trọng hơn, nếu bạn đổi tên một tệp Bảng tính của tôi.xlsx thành Bảng tính của tôi, sau đó thử mở nó với xdg-open My-Spreadsheetbạn sẽ nhận được tệp này (vì thực tế đó là một tệp nén):

Và nếu bạn đổi tên một tệp My Spreadsheet.xlsthành My-Spreadsheet, khi xdg-open My-Spreadsheetbạn gặp lỗi nói

vị trí mở lỗi: Không có ứng dụng nào được đăng ký khi xử lý tệp này

(Mặc dù trong cả hai trường hợp này, nó vẫn hoạt động tốt nếu bạn làm soffice My-Spreadsheet)

Nếu bạn sau đó đổi tên file extensionless đến My-Spreadsheet.odsvới mvvà cố gắng mở nó, bạn sẽ có được điều này:

(sửa chữa thất bại)

Và bạn sẽ phải đặt lại tiện ích mở rộng ban đầu để mở tệp chính xác (sau đó bạn có thể chuyển đổi định dạng nếu muốn)

TL; DR:

Nếu bạn có các tệp không phải bản địa có tiện ích mở rộng tên, đừng xóa các tiện ích mở rộng giả sử mọi thứ sẽ ổn!


4
Tài liệu MS Office kiểu mới (docx, xlsx, pptx, v.v.) không có phần mở rộng tệp sẽ mở trong trình quản lý lưu trữ vì các loại tệp đó thực sự chỉ là các tệp nén ZIP thông thường chứa tất cả các tài liệu XML và tệp phương tiện cần thiết để xác định nội dung tài liệu. Định dạng tệp của thư mục nén ZIP hiện nay khá phổ biến btw.
Chỉ huy Byte

1
Đã có nhiều câu trả lời tuyệt vời, nhưng chỉ một câu trả lời cụ thể hơn về sự phản đối mà tôi đã nhận thấy. Bạn tạo một tệp gồm các giá trị được phân tách bằng dấu phẩy (CSV) và lưu nó dưới dạng "test.csv", một cửa sổ sẽ mở ra hỏi bạn đang sử dụng loại dấu phân cách nào (ví dụ: libreoffice Calc). Ví dụ, nếu bạn đổi tên tệp này thành "test.cs", thì Trình soạn thảo của libreoffice sẽ mở nó. Vì vậy, bên cạnh ví dụ ZIP ở trên, có vẻ như libreoffice sử dụng phần mở rộng tệp.
Ray

3
Hệ thống tập tin linux không làm bất cứ điều gì liên quan đến các loại tập tin. Đó là tất cả các chương trình chạy trên đầu trang của nó.
Peter Green

@PeterGreen Có, nhưng thực tế là các chương trình gán tầm quan trọng của nó có nghĩa là nó không "chỉ dành cho con người", ví dụ, MacOS cổ điển đã có nó [có các loại tệp "bốn byte" và "ứng dụng người tạo" Là một phần của tên tệp, vì vậy HĐH và ứng dụng có tất cả thông tin họ cần mà không cần xem phần mở rộng tệp]
Random832

3
@PeterGreen Hệ thống tệp Windows cũng không làm gì liên quan đến các loại tệp. Trình bao đồ họa (Windows Explorer) sử dụng phần mở rộng tệp để chọn một hành động cho nhấp đúp, nhưng về mặt kỹ thuật đó chỉ là một chương trình chạy trên hệ điều hành, giống như Nautilus. Hoàn toàn có thể viết trình quản lý tệp Linux với hành vi đó hoặc Windows đã kiểm tra nội dung tệp.
IMSoP

20

Tôi muốn có một cách tiếp cận khác với câu trả lời khác và thách thức khái niệm rằng "Linux" hay "Windows" có liên quan gì đến điều này (chịu đựng với tôi).

Khái niệm về phần mở rộng tệp có thể được biểu thị đơn giản là "quy ước để xác định loại tệp dựa trên một phần tên của nó". Các quy ước phổ biến khác để xác định loại tệp là so sánh nội dung của nó với cơ sở dữ liệu chữ ký đã biết (phương pháp "số ma thuật") và lưu trữ dưới dạng một thuộc tính bổ sung trên hệ thống tệp (cách tiếp cận được sử dụng trong MacOS gốc) .

Vì mọi tệp trên Windows hoặc hệ thống Linux đều có cả tên và nội dung, nên các quy trình muốn biết loại tệp có thể sử dụng phương pháp "mở rộng" hoặc "số ma thuật" khi chúng thấy phù hợp. Cách tiếp cận siêu dữ liệu thường không có sẵn, vì không có vị trí chuẩn cho thuộc tính này trên hầu hết các hệ thống tệp.

Trên Windows, có một truyền thống mạnh mẽ về việc sử dụng phần mở rộng tệp làm phương tiện chính để xác định tệp; rõ ràng nhất, trình duyệt tệp đồ họa (Trình quản lý tệp trên Windows 3.1 và Explorer trên Windows hiện đại) sử dụng nó khi bạn nhấp đúp vào tệp để xác định ứng dụng nào sẽ khởi chạy. Trên Linux (và, nói chung hơn, các hệ thống dựa trên Unix), có nhiều truyền thống hơn để kiểm tra nội dung; đáng chú ý nhất, kernel nhìn vào phần đầu của tệp được thực thi trực tiếp để xác định cách chạy nó; tập tin tập lệnh có thể chỉ ra một trình thông dịch sẽ sử dụng bằng cách bắt đầu bằng #!theo sau là đường dẫn đến trình thông dịch.

Những truyền thống này ảnh hưởng đến thiết kế UI của các chương trình được viết cho mỗi hệ thống, nhưng có rất nhiều trường hợp ngoại lệ, bởi vì mỗi cách tiếp cận đều có ưu và nhược điểm trong các tình huống khác nhau. Các lý do để sử dụng tiện ích mở rộng tệp thay vì kiểm tra nội dung bao gồm:

  • kiểm tra nội dung tập tin khá tốn kém so với kiểm tra tên tập tin; vì vậy, ví dụ "tìm tất cả các tệp có tên * .conf" sẽ nhanh hơn rất nhiều so với "tìm tất cả các tệp có dòng đầu tiên khớp với chữ ký này"
  • nội dung tập tin có thể mơ hồ; nhiều định dạng tệp thực sự chỉ là các tệp văn bản được xử lý theo cách đặc biệt, nhiều định dạng khác là các tệp zip có cấu trúc đặc biệt và việc xác định chữ ký chính xác cho các định dạng này có thể khó khăn
  • một tập tin thực sự có thể có giá trị như nhiều hơn một loại; một tệp HTML cũng có thể là XML hợp lệ, một tệp zip và GIF được nối với nhau vẫn hợp lệ cho cả hai định dạng
  • khớp số ma thuật có thể dẫn đến dương tính giả; một định dạng tệp không có tiêu đề có thể xảy ra để bắt đầu bằng các byte "GIF89a" và được xác định nhầm thành hình ảnh GIF
  • đổi tên một tập tin có thể là một cách thuận tiện để đánh dấu nó là "bị vô hiệu hóa"; vd tương tự, đổi tên tệp .php thành .txt sẽ bảo Apache phục vụ nguồn của nó dưới dạng văn bản thuần túy, thay vì chuyển nó sang công cụ PHP

Ví dụ về các chương trình Linux sử dụng tên tệp theo mặc định (nhưng có thể có các chế độ khác):

  • gzip và gunzip có cách xử lý đặc biệt đối với mọi tệp kết thúc ".gz"
  • gcc sẽ xử lý các tệp ".c" là C và ".cc" hoặc ".C" là C ++

Windows cũng có truyền thống che giấu tiện ích mở rộng nếu nó "nổi tiếng" và thậm chí DOS cho phép một lệnh bỏ qua .COM, .BAT và .EXE, tự động tìm kiếm các phần mềm để xác định chương trình thực tế nào sẽ thực thi. Không có truyền thống như vậy trong * nix.
Monty Harder

Đây là một câu trả lời tốt hơn nhiều nhưng có một lỗi thực tế ... một kịch bản không thể được thực thi bằng cách đặt #!ở đầu. Bất kỳ tệp nào có (các) bit thực thi của nó có thể được thực thi theo một trong nhiều cách. #!/bin/bashvà chữ ký tương tự chỉ cần xác định thông dịch viên sẽ sử dụng. Nếu không có chữ ký như vậy được cung cấp, trình thông dịch shell mặc định được giả sử. Một tệp không chứa gì ngoài hai từ 'Hello World', nhưng với bit thực thi được đặt, sẽ cố gắng tìm lệnh 'Hello' khi chạy.
DocSalvager

1
@DocSalvager Bắt tốt, đó là từ ngữ vụng về nhiều như mọi thứ. Tôi đã điều chỉnh lại một chút để làm rõ rằng shebang không làm cho tập lệnh có thể thực thi được, nó chỉ thay đổi cách nó được thực thi.
IMSoP

15

Trên thực tế, một số công nghệ làm dựa vào phần mở rộng tập tin, vì vậy nếu bạn sử dụng những công nghệ trong Ubuntu, bạn sẽ phải dựa vào phần mở rộng quá. Một vài ví dụ:

  • gccsử dụng các phần mở rộng để phân biệt giữa các tệp C và C ++. Không có phần mở rộng, không thể phân biệt được chúng (hãy tưởng tượng một tệp C ++ không có lớp).
  • nhiều tác phẩm ( docx, jar, apk) đều chỉ đặc biệt có cấu trúc tài liệu lưu trữ ZIP. Mặc dù bạn thường có thể suy ra loại từ nội dung, nhưng nó có thể không phải lúc nào cũng có thể (ví dụ: Bản kê khai Java là tùy chọn trong jarcác tệp).

Không sử dụng phần mở rộng tệp trong các trường hợp như vậy sẽ chỉ có thể với các cách giải quyết khó khăn và có khả năng rất dễ bị lỗi.


Tốt cho bạn khi đề cập đến lập trình, nhưng bạn đã nhận được hầu hết các chi tiết sai. gcclà giao diện người dùng cho các tệp C, đối với các tệp C ++, bạn cần g++chuyển đổi đầu cuối hoặc chuyển đổi dòng lệnh để chỉ định ngôn ngữ. Quan trọng hơn là makechương trình quyết định sử dụng gcchay g++xây dựng một tệp cụ thể - và makehoàn toàn phụ thuộc vào các mẫu tên tệp (chủ yếu là các phần mở rộng) để phù hợp với quy tắc của nó.
Ben Voigt

@BenVoigt Khi biên dịch một tệp có .ccphần mở rộng gcc, nó thực sự sẽ được biên dịch thành C ++ và điều này được ghi lại trong man gcc: "Đối với bất kỳ tệp đầu vào cụ thể nào, hậu tố tên tệp xác định loại biên dịch nào được thực hiện:" theo sau là danh sách phần mở rộng và cách chúng được xử lý.
hvd

1
@hvd Sau đó, có thể đó là bộ thư viện mặc định bị lỗi khủng khiếp nếu bạn không sử dụng đúng lối vào. Dù sao thực hiện là ví dụ điển hình bởi vì mọi thứ nó làm đều dựa trên phần mở rộng tập tin.
Ben Voigt

1
@BenVoigt makecũng là một ví dụ điển hình, nhưng gccchỉ dựa nhiều vào tên tập tin. Đây là một ví dụ rõ ràng hơn so .cvới vs .cc: Đối với C, gccsử dụng hậu tố để cho biết bước đầu tiên của nó là tiền xử lý ( .c), biên dịch ( .i), lắp ráp ( .s) hoặc liên kết ( .o). Ở đây, tôi sử dụng -E, -S-cđể biết gccnơi dừng lại , nhưng nó sử dụng tên tệp để biết bắt đầu từ đâu . gcc something.ccsẽ không liên kết đến các thư viện phù hợp cho C ++ nhưng nó sẽ coi tệp là C ++, đó là lý do tại sao nhiều người dùng bị nhầm lẫn bởi các thông báo lỗi họ nhận được khi mắc lỗi đó.
Eliah Kagan

7

Giả định đầu tiên của bạn là chính xác: các phần mở rộng trên Linux không quan trọng và chỉ hữu ích cho con người (và các HĐH không giống Unix khác quan tâm đến các phần mở rộng). Loại tệp được xác định bởi 32 bit dữ liệu đầu tiên trong tệp, được gọi là số ma thuật Đây là lý do tại sao các tập lệnh shell cần #!dòng - để báo cho hệ điều hành biết trình thông dịch nào sẽ gọi. Không có nó, tập lệnh shell chỉ là tập tin văn bản.

Theo như các nhà quản lý tập tin, họ muốn biết các phần mở rộng của một số tệp, chẳng hạn như .desktopcác tệp, về cơ bản giống như phiên bản phím tắt của Window nhưng có nhiều khả năng hơn. Nhưng theo như OS, nó cần biết những gì trong tệp chứ không phải những gì trong tên của nó


3
Điều này không hoàn toàn đúng. Có những chương trình mong đợi một phần mở rộng cụ thể. Ví dụ được sử dụng phổ biến nhất có lẽ là gunzipsẽ không giải nén tệp nếu nó không được gọi foo.gz.
terdon

Đó là một triển khai của phần mềm cụ thể. Đối với hầu hết các phần, các tiện ích trên các hệ thống giống như không mong đợi một phần mở rộng.
Sergiy Kolodyazhnyy

7
Đối với hầu hết các phần họ không, không. Tuy nhiên, câu đầu tiên của bạn tuyên bố rằng chúng không bao giờ được sử dụng và chỉ quan trọng đối với con người. Điều đó không hoàn toàn đúng. gunziplà một ví dụ, là một ví dụ eogkhác. Ngoài ra, nhiều công cụ sẽ không tự động điền tên mà không có phần mở rộng đúng. Tất cả tôi đang nói là nó phức tạp hơn một chút so với "tiện ích mở rộng luôn không liên quan".
terdon

1
1 vấn đề nhỏ: OP hỏi về hệ điều hành. 'gunzip' và 'eog' không phải là hệ điều hành nhưng đã quyết định tạo các hạn chế riêng (trong trường hợp gunzip) hoặc phương thức (eog). "loại mime" mặc dù.
Rinzwind

1
@Serg Chắc chắn, bạn có thể xác định hệ điều hành hẹp và nhận được câu trả lời tầm thường cho câu hỏi. Tuy nhiên, đây không phải là một câu trả lời đặc biệt hữu ích vì phần lớn những gì người dùng làm với máy tính liên quan đến phần mềm bạn đã loại trừ. Lưu ý rằng câu hỏi tương phản "chỉ dành cho con người" so với "hệ điều hành"; Tôi không nghĩ họ có nghĩa là "hạt nhân".
IMSoP

6

Đây là một quá lớn cho một câu trả lời nhận xét.

Hãy nhớ rằng ngay cả "phần mở rộng" cũng có rất nhiều ý nghĩa khác nhau.

Những gì bạn nói về dường như là 3 chữ cái sau. DOS làm cho định dạng 8.3 thực sự phổ biến và các cửa sổ sử dụng phần .3 cho đến ngày nay.

Linux có rất nhiều tệp như .conf hoặc .list hoặc .d hoặc .c có ý nghĩa, nhưng không thực sự là các phần mở rộng theo nghĩa 8.3. Ví dụ, Apache xem /etc/apache2/sites-enables/website.conf để biết chỉ thị cấu hình của nó. Mặc dù hệ thống sử dụng các loại MIME và các tiêu đề nội dung và những gì không xác định đó là tệp văn bản, Apache (theo mặc định) vẫn sẽ không tải nó mà không kết thúc bằng .conf.

.c là một trong những tuyệt vời. Đúng là một tệp văn bản, nhưng gcc phụ thuộc vào main.c trở thành main.o và cuối cùng là chính (sau khi liên kết). Không có lúc nào hệ thống sử dụng .c, .o hoặc không có phần mở rộng để có bất kỳ ý nghĩa nào về nội dung, nhưng các công cụ sau. không có ý nghĩa gì Bạn có thể sẽ thiết lập SCM của bạn để bỏ qua main.o và main.

Điểm chính là đây: Tiện ích mở rộng không được sử dụng theo cách chúng ở trong cửa sổ. Nhân sẽ không thực thi tệp .txt vì bạn xóa phần .txt của tên. Cũng rất vui khi thực thi tệp .txt nếu quyền thực thi được đặt. Điều đó đang được nói, chúng có ý nghĩa, và vẫn được sử dụng ở "cấp độ máy tính" cho nhiều thứ.


1
Windows cũng không bị ràng buộc với x.3sơ đồ đặt tên nữa, bạn đã có phần mở rộng còn ở đó cũng như .doxc, .torrent, .part, vv Đó là chỉ rằng nhiều định dạng file và phần mở rộng đã được định nghĩa lại trong thời điểm 8.3 đặt tên vẫn còn là một điều và sau đó các định dạng chủ yếu chỉ đơn giản là điều chỉnh quy ước sử dụng tối đa 3 chữ cái.
Chỉ huy Byte

Tôi không thấy ".conf", ".c", v.v., "có nghĩa khác" với "nghĩa 8.3". Khái niệm về phần mở rộng tệp có thể được biểu thị đơn giản là "quy ước để xác định loại tệp dựa trên một phần tên của nó". Thậm chí DOS / Win3.1 không yêu cầu tiện ích mở rộng chính xác (bạn có thể gọi tài liệu Word là "STUPIDN.AME" và mở nó bằng Ctrl-O trong WinWord). Chỉ là một số hệ thống (ví dụ như nhấp đúp chuột vào Windows, gzipMakefile của bạn, v.v.) có thể được viết để sử dụng quy ước này để đưa ra các giả định về hành động chính xác để thực hiện trên mỗi tệp.
IMSoP

@ByteCommander Điều đó đúng, nhưng tiện ích mở rộng vẫn xác định ứng dụng được sử dụng. Tôi không chắc làm thế nào để chỉnh sửa câu trả lời để phản ánh điều đó.
coteyr

1
@coteyr Một lần nữa, tất cả phụ thuộc vào ý nghĩa của "Hệ điều hành". Các File Manager chắc chắn sẽ tìm kiếm một khóa registry cho "AME", và sẽ nói với tôi rằng "foo.txt" là một tập tin văn bản. Nhưng chạy dirtại một dấu nhắc lệnh sẽ cho tôi biết không có điều đó; nó chỉ đơn giản là không quan tâm. Thực thi các tập tin chắc chắn là một ngoại lệ, trên cả hai hệ điều hành; nếu câu hỏi được giới hạn trong số đó, câu trả lời sẽ là DOS / Windows chỉ quan tâm đến tên và Unix / Linux chỉ quan tâm đến quyền thực thi và các byte đầu tiên của tệp. Bên ngoài đó, luôn có một số ứng dụng chọn một quy ước để tuân theo.
IMSoP

1
@coteyr Bạn đã quên * .scr (trình bảo vệ màn hình nhị phân) trong Windows 3.1 trở lên. Điều đó nói rằng, phần mở rộng tập tin ngay cả trong các hệ thống DOS / Windows ngay cả đối với các tệp thực thi vẫn chỉ là một sự tiện lợi. Các chi tiết cụ thể phụ thuộc rất nhiều vào nơi bạn vẽ dòng "hệ điều hành", nhưng bạn luôn có thể tải nhị phân vào bộ nhớ và tự nhảy vào đó, thực hiện công việc mà người ta thường yêu cầu HĐH thực hiện. Trong MS-DOS, nếu bạn xem qua lệnh.com, tôi khá chắc chắn có một danh sách như EXE COM mà bạn có thể chỉnh sửa để tìm các tiện ích mở rộng khác nếu không có phần mở rộng nào (không nói đó là một ý tưởng hay, phiền bạn).
một CVn
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.