นามสกุลไฟล์มีวัตถุประสงค์ใด ๆ (สำหรับระบบปฏิบัติการ) หรือไม่?


73

Linux กำหนดประเภทของไฟล์ผ่านรหัสในส่วนหัวของไฟล์ มันไม่ได้ขึ้นอยู่กับนามสกุลของไฟล์เพื่อที่จะรู้ว่าจะใช้ซอฟต์แวร์ตัวไหนในการเปิดไฟล์

นั่นคือสิ่งที่ฉันจำได้จากการศึกษาของฉัน โปรดแก้ไขฉันในกรณีที่ฉันผิด!

ทำงาน bit กับระบบ Ubuntu เมื่อเร็ว ๆ นี้: ฉันเห็นมากของไฟล์บนระบบที่มีนามสกุลเหมือน.sh, .txt, .o,.c

ตอนนี้ฉันสงสัยว่า: ส่วนขยายเหล่านี้มีไว้สำหรับมนุษย์เท่านั้นหรือไม่ ดังนั้นควรจะได้รับความคิดว่ามันเป็นไฟล์ประเภทใด?

หรือพวกเขามีวัตถุประสงค์บางอย่างสำหรับระบบปฏิบัติการด้วยหรือไม่


5
หากคุณไม่ได้รับการตอบรับที่ดีโปรดจำไว้ว่ายังมีunix.stackexchange.com
mchid

ที่เกี่ยวข้อง, ซ้ำกันเกือบ: askubuntu.com/questions/390015/…
Zzzach ...

เกี่ยวข้อง: unix.stackexchange.com/questions/207276/…
chaos

5
พวกเขาทำใน Windows ใน Linux / Unix พวกเขาส่วนใหญ่ทำไม่ได้ ข้อยกเว้นหลักคือการบีบอัดโปรแกรม - gzip, bzip2, xz- และอื่น ๆ โปรแกรมเหล่านี้ใช้คำต่อท้ายเพื่อแยกไฟล์บีบอัดจากไฟล์ที่ไม่มีการบีบอัด โปรแกรมบีบอัดมักจะบ่นเกี่ยวกับคำต่อท้ายที่ไม่ถูกต้องแม้ว่าไฟล์จริง ๆ แล้วเป็นไฟล์บีบอัดที่ควรจะจัดการ
Baard Kopperud

6
ฉันคิดว่าส่วนหนึ่งของปัญหากับคำถามนี้คือ "ระบบปฏิบัติการ" ไม่ใช่แนวคิดที่ชัดเจน ส่วนใดของระบบปฏิบัติการและแอพพลิเคชั่นอยู่ด้านบนของมันคืออะไร? มีไม่กี่ส่วนของระบบปฏิบัติการ (ไม่ว่าระบบปฏิบัติการใดที่เรากำลังพูดถึง) ดูแลไฟล์ประเภทใด - พวกเขาแค่ทำตามที่พวกเขาบอก ข้อแตกต่างเกี่ยวกับวิธีที่พวกเขารู้ว่าไม่เกี่ยวข้อง พวกเขาทำไม่ได้ ในทางกลับกัน Applcations อาจทำสิ่งหนึ่งหรือทั้งสองอย่างได้ดี
IMSoP

คำตอบ:


39

Linux กำหนดประเภทของไฟล์ผ่านรหัสในส่วนหัวของไฟล์ ไม่ได้ขึ้นอยู่กับนามสกุลของไฟล์ที่ต้องรู้ด้วยซอฟต์แวร์คือการใช้สำหรับเปิดไฟล์

นั่นคือสิ่งที่ฉันจำได้จากการศึกษาของฉัน โปรดแก้ไขฉันในกรณีที่ฉันผิด!

  • จำได้อย่างถูกต้อง

ส่วนขยายเหล่านี้มีไว้สำหรับมนุษย์เท่านั้นหรือไม่

  • ใช่ด้วย แต่

เมื่อคุณโต้ตอบกับระบบปฏิบัติการอื่น ๆ ที่ขึ้นอยู่กับส่วนขยายว่าเป็นสิ่งที่พวกเขาเป็นมันเป็นความคิดที่ชาญฉลาดในการใช้งานเหล่านั้น

ใน Windows ซอฟต์แวร์ที่แนบมากับส่วนขยายเปิดอยู่

เปิดแฟ้มข้อความที่มีชื่อว่า "แฟ้ม" เป็นเรื่องยากใน Windows กว่าการเปิดไฟล์เดียวกันชื่อ "file.txt" (คุณจะต้องเปลี่ยนไฟล์โต้ตอบเปิดให้บริการตั้งแต่*.txtการ*.*ทุกครั้ง) เช่นเดียวกับ TAB และไฟล์ข้อความที่คั่นด้วยเครื่องหมายอัฒภาค เช่นเดียวกันสำหรับการนำเข้าและส่งออกอีเมล (นามสกุล. mbox)

โดยเฉพาะอย่างยิ่งเมื่อคุณรหัสซอฟต์แวร์ การเปิดไฟล์ชื่อ "software1" ซึ่งเป็นไฟล์ HTML และ "software2" ซึ่งเป็นไฟล์ JavaScript จะยากกว่าเมื่อเทียบกับ "software.html" และ "software.js"


หากมีระบบใน Linux ที่ส่วนขยายไฟล์มีความสำคัญฉันจะเรียกว่าข้อบกพร่อง เมื่อซอฟต์แวร์ขึ้นอยู่กับนามสกุลของไฟล์นั่นคือการเอาเปรียบ เราใช้ล่ามคำสั่งเพื่อระบุว่าไฟล์คืออะไร ("สองไบต์แรกในไฟล์สามารถเป็นอักขระ" #! "ซึ่งประกอบด้วยหมายเลขเวทย์มนตร์ (เลขฐานสิบหก 23 และ 21, ค่า ASCII ของ" # "และ"! ") มักเรียกว่า shebang")

ปัญหาที่โด่งดังที่สุดของนามสกุลไฟล์คือLOVE-LETTER-FOR-YOU.TXT.vbsบน Windows นี่เป็นสคริปต์พื้นฐานแบบเห็นภาพที่แสดงใน file explorer เป็นไฟล์ข้อความ

ใน Ubuntu เมื่อคุณเริ่มต้นไฟล์จาก Nautilus คุณจะได้รับคำเตือนว่าจะต้องทำอะไร การเรียกใช้สคริปต์จาก Nautilus ที่ต้องการเริ่มซอฟต์แวร์บางอย่างที่ควรเปิด gEdit นั้นเป็นปัญหาที่เห็นได้ชัดและเราได้รับคำเตือนเกี่ยวกับเรื่องนี้

ในบรรทัดคำสั่งเมื่อคุณดำเนินการบางอย่างคุณจะเห็นได้ว่าส่วนขยายคืออะไร ถ้ามันจบลงที่. vbs ฉันจะเริ่มสงสัย (ไม่ใช่ว่า. vbs นั้นสามารถเรียกใช้งานได้บน Linux อย่างน้อยก็ไม่มีความพยายามใด ๆ เพิ่มเติม))


31
ฉันไม่เข้าใจสิ่งที่คุณต้องการจะพูดในประโยคสุดท้ายของคุณ อย่างแรกมันเป็นปัญหาของการซ่อนส่วนขยายแทนที่จะมีส่วนที่สองการหาช่องโหว่จะใช้งานได้เหมือนกันใน Linux - คุณตั้งชื่อไฟล์ไบนารีreadme.txtและทำให้มันทำงานได้ หากผู้ใช้เรียกใช้งานจะไม่เปิดตัวแก้ไข แต่เรียกใช้รหัส ในส่วนนี้การทำให้ส่วนขยายสำคัญ (แต่ไม่ได้ซ่อนไว้) มีความปลอดภัยและอธิบายได้ง่ายขึ้นสำหรับผู้ใช้ที่ไม่เข้าใจ มีความแตกต่างอื่น ๆ (ส่วนใหญ่ไม่ได้เรียกใช้ไฟล์จากไดเรกทอรีปัจจุบัน) แต่พวกเขาไม่มีส่วนเกี่ยวข้องกับส่วนขยาย
techraf

4
@techraf ที่จริงแล้วโปรแกรมจัดการไฟล์อาจพยายามเปิดreadme.txtไฟล์ด้วยโปรแกรมแก้ไขข้อความ ฉันเพิ่งลองกับปลาโลมาใน KDE สร้างเชลล์สคริปต์เพิ่มสิทธิ์การใช้งานบันทึก.txtและคลิกที่มันจะทำให้เปิดใน Kate ถ้าผมเปลี่ยนชื่อไป.shแล้วคลิกที่มันวิ่งมัน
Bakuriu

9
linux: เนื่องจาก make เป็นการสร้างรอบกฎที่ขึ้นอยู่กับนามสกุลไฟล์สิ่งนี้จะไม่สร้าง (ไม่มีการเล่นสำนวน) ส่วนขยายที่มีความหมายมากกว่าแค่มนุษย์ใช่มั้ย
bolov

15
นี่เป็นคำตอบที่ผิดอย่างมหันต์ บางส่วนของ Linux ใช้หมายเลขเวทย์มนตร์เพื่อกำหนดประเภทไฟล์ การดำเนินการไฟล์ที่บรรทัดคำสั่ง แต่ส่วนใหญ่อื่น ๆ ของระบบใช้ส่วนขยายของไฟล์เพื่อรู้ว่าจะต้องดูอะไรไม่ว่าจะเป็นตัวเชื่อมโยงแบบไดนามิก (ซึ่งต้องการไฟล์. so), modprobe, สร้างระบบ, ปลั๊กอิน, ไลบรารี่สำหรับหลาม, ทับทิมและอื่น ๆ ไม่มีตัวเลขเวทมนต์ซึ่งfileเป็นแบบแก้ปัญหาได้ไม่แน่นอน
Alan Shutko

3
"Linux กำหนดประเภทของไฟล์ผ่านรหัสในส่วนหัวของไฟล์" "ถูกต้อง" WTF หรือไม่? "รหัสในส่วนหัวของไฟล์" คืออะไร ไม่มีรหัสดังกล่าวและไม่มี "header file" ทั่วไปใน Linux
leonbloy

68

ไม่มีคำตอบขาวดำหรือสีขาว 100%

โดยปกติแล้ว Linux ไม่พึ่งพาชื่อไฟล์ (และนามสกุลไฟล์เช่นส่วนหนึ่งของชื่อไฟล์หลังจากช่วงเวลาสุดท้ายตามปกติ) และกำหนดประเภทไฟล์โดยการตรวจสอบสองสามไบต์แรกของเนื้อหาและเปรียบเทียบกับรายการหมายเลขมายากลที่รู้จัก.

ตัวอย่างเช่นไฟล์ภาพบิตแมปทั้งหมด (โดยปกติจะมีนามสกุลเป็นชื่อ.bmp) จะต้องเริ่มต้นด้วยตัวอักษรBMในสองไบต์แรก สคริปต์ในภาษาสคริปต์ส่วนใหญ่เช่น Bash, Python, Perl, AWK และอื่น ๆ (โดยทั่วไปทุกอย่างที่ปฏิบัติกับบรรทัดที่เริ่มต้นด้วย#ความคิดเห็น) อาจมี Shebang เหมือนกับ#!/bin/bashบรรทัดแรก ความคิดเห็นพิเศษนี้จะบอกระบบว่าแอพพลิเคชั่นใดที่จะเปิดไฟล์

ตามปกติระบบปฏิบัติการจะอาศัยเนื้อหาไฟล์และไม่ใช่ชื่อเพื่อกำหนดประเภทไฟล์ แต่การระบุว่าไม่จำเป็นต้องใช้นามสกุลไฟล์บน Linux จึงเป็นเพียงครึ่งหนึ่งของความจริง


แอปพลิเคชันอาจใช้การตรวจสอบไฟล์ของพวกเขาตามที่ต้องการซึ่งรวมถึงการตรวจสอบชื่อไฟล์และนามสกุล ตัวอย่างคือ Eye of Gnome ( eogโปรแกรมดูรูปภาพมาตรฐาน) ซึ่งกำหนดรูปแบบรูปภาพโดยนามสกุลไฟล์และส่งข้อผิดพลาดหากไม่ตรงกับเนื้อหา ไม่ว่าจะเป็นข้อบกพร่องหรือคุณสมบัติสามารถพูดคุย ...

อย่างไรก็ตามแม้บางส่วนของระบบปฏิบัติการจะขึ้นอยู่กับนามสกุลของไฟล์เช่นเมื่อทำการวิเคราะห์ไฟล์ของซอฟต์แวร์ในไฟล์/etc/apt/sources.list.d/- เฉพาะไฟล์ที่มี*.listนามสกุลเท่านั้นที่จะถูกวิเคราะห์คำอื่น ๆ ทั้งหมดจะถูกละเว้น อาจไม่ได้ใช้เพื่อระบุประเภทไฟล์ที่นี่เป็นหลัก แต่เป็นการเปิด / ปิดใช้งานการแยกวิเคราะห์ไฟล์บางไฟล์ แต่ก็ยังเป็นนามสกุลไฟล์ที่มีผลต่อวิธีที่ระบบปฏิบัติกับไฟล์

และแน่นอนว่าผลกำไรของผู้ใช้ของมนุษย์มากที่สุดจากนามสกุลไฟล์เป็นที่ทำให้ประเภทของไฟล์ที่เห็นได้ชัดและยังช่วยให้หลายไฟล์ที่มีชื่อฐานเดียวกันและนามสกุลที่แตกต่างกันเช่นsite.html, site.php, site.js, site.cssขยาย ฯลฯ ข้อเสียคือแน่นอนว่าไฟล์และที่เกิดขึ้นจริง ประเภทไฟล์ / เนื้อหาไม่จำเป็นต้องตรงกัน

นอกจากนี้ยังจำเป็นสำหรับข้ามแพลตฟอร์มการทำงานร่วมกันเป็นเช่น Windows จะไม่ทราบว่าจะทำอย่างไรกับreadmeไฟล์ readme.txtแต่เพียง


คุณขัดแย้งกับตัวเองเล็กน้อยที่นี่: หากโปรแกรมดูรูปภาพมาตรฐานต้องการชื่อไฟล์ที่ลงท้ายด้วย. bmp คุณกำลังพูดว่าส่วนใดของระบบปฏิบัติการที่ต้องอาศัยเนื้อหาไฟล์ที่เริ่มต้น "BM" AFAIK "เวทมนต์หมายเลขเดียวที่เคอร์เนลใส่ใจคือประเภทที่สามารถใช้งานได้รวมถึงกรณีพิเศษของ#!ทุกอย่างอื่นขึ้นอยู่กับการตัดสินใจของแอปพลิเคชัน
IMSoP

@IMSoP ฉันไม่รู้ว่าจะใช้งานeogอย่างไรและฉันไม่รู้ว่าทำไมพวกเขาถึงสนใจชื่อไฟล์เลย นี่เป็นข้อบกพร่องในความคิดของฉัน และแน่นอนถ้าไฟล์ชื่อ "bmp" แต่รูปแบบเนื้อหาไม่ตรงกันจะมีข้อผิดพลาดเช่นกันแน่นอน แน่นอนว่าแต่ละแอปพลิเคชั่นตัดสินใจว่าจะตรวจสอบไฟล์ได้อย่างไร แต่โดยทั่วไปแล้วแอพพลิเคชั่น Linux ไม่ควรใช้ชื่อ อย่างไรก็ตามคุณสามารถใช้คำfileแนะนำเพื่อตรวจสอบประเภทไฟล์ตามเนื้อหา
ผู้บัญชาการ Byte

1
ประโยคที่ฉันท้าทายคือ: "Linux ... กำหนดประเภทไฟล์โดยตรวจสอบสองสามไบต์แรก" คุณใช้คำว่า "Linux" ในประโยคนั้น? การมีอยู่ของfileยูทิลิตี้ไม่ได้พิสูจน์อะไรเลย มันเป็นเครื่องมือที่มีประโยชน์ที่สามารถมีอยู่ในระบบปฏิบัติการใด ๆ ส่วนพื้นฐานของระบบปฏิบัติการfileใดที่ทำให้การทำงาน"ถูกต้อง" มากกว่าการวนชื่อไฟล์
IMSoP

โปรดทราบว่าไฟล์ที่ไม่มีนามสกุลสามารถเชื่อมโยงกับโปรแกรม
isanae

24

ตามที่ผู้อื่นกล่าวถึงใน Linux จะใช้วิธีสั่งการล่าม (เก็บข้อมูลเมตาบางส่วนในไฟล์เป็นส่วนหัวหรือหมายเลขมายากลเพื่อให้ผู้แปลที่ถูกต้องสามารถบอกให้อ่านได้) แทนที่จะใช้วิธีเชื่อมโยงส่วนขยายชื่อไฟล์ที่ Windows ใช้

ซึ่งหมายความว่าคุณสามารถสร้างไฟล์ด้วยชื่อเกือบทุกชื่อที่คุณชอบ ... โดยมีข้อยกเว้นเล็กน้อย

อย่างไรก็ตาม

ฉันต้องการเพิ่มคำเตือน

หากคุณมีไฟล์บางไฟล์ในระบบของคุณจากระบบที่ใช้การเชื่อมโยงชื่อไฟล์ไฟล์อาจไม่มีหมายเลขมายากลหรือส่วนหัวเหล่านั้น ส่วนขยายชื่อไฟล์ถูกใช้เพื่อระบุไฟล์เหล่านี้โดยแอปพลิเคชันที่สามารถอ่านได้และคุณอาจประสบกับผลกระทบที่ไม่คาดคิดหากคุณเปลี่ยนชื่อไฟล์ดังกล่าว ตัวอย่างเช่น:

หากคุณเปลี่ยนชื่อไฟล์My Novel.docเป็นMy-NovelLibreoffice จะยังสามารถเปิดได้ แต่จะเปิดเป็น 'ไม่มีชื่อ' และคุณจะต้องตั้งชื่ออีกครั้งเพื่อบันทึก (Libreoffice เพิ่มส่วนขยายตามค่าเริ่มต้นดังนั้นคุณจะมี สองไฟล์My-NovelและMy-Novel.odtซึ่งอาจน่ารำคาญ)

หากคุณเปลี่ยนชื่อไฟล์ My Spreadsheet.xlsx เป็น My-Spreadsheet จากนั้นลองเปิดไฟล์ด้วยxdg-open My-Spreadsheetคุณจะได้รับสิ่งนี้ (เพราะจริงๆแล้วเป็นไฟล์บีบอัด):

และถ้าคุณเปลี่ยนชื่อไฟล์My Spreadsheet.xlsเป็นMy-Spreadsheetเมื่อxdg-open My-Spreadsheetคุณได้รับข้อผิดพลาดว่า

ข้อผิดพลาดในการเปิดตำแหน่ง: ไม่มีแอปพลิเคชันที่ลงทะเบียนเป็นการจัดการไฟล์นี้

(แม้ว่าในทั้งสองกรณีนี้จะใช้งานได้ถ้าคุณทำsoffice My-Spreadsheet)

จากนั้นถ้าคุณเปลี่ยนชื่อไฟล์ extensionless ไปMy-Spreadsheet.odsด้วยmvและพยายามที่จะเปิดมันคุณจะได้รับนี้

(การซ่อมแซมล้มเหลว)

และคุณจะต้องใส่นามสกุลเดิมอีกครั้งเพื่อเปิดไฟล์อย่างถูกต้อง (คุณสามารถแปลงรูปแบบได้หากต้องการ)

TL; DR:

หากคุณมีไฟล์ที่ไม่ใช่เจ้าของภาษาที่มีส่วนขยายชื่ออย่าลบส่วนขยายที่สมมติว่าทุกอย่างจะโอเค!


4
เอกสาร MS Office รูปแบบใหม่ (docx, xlsx, pptx ฯลฯ ) โดยไม่มีนามสกุลไฟล์จะเปิดขึ้นในตัวจัดการเก็บถาวรเพราะประเภทไฟล์เหล่านั้นเป็นเพียงไฟล์บีบอัด ZIP ทั่วไปซึ่งมีเอกสาร XML และไฟล์สื่อทั้งหมดที่จำเป็นในการกำหนดเนื้อหาของเอกสาร รูปแบบไฟล์ของไดเรกทอรีบีบอัด ZIP เป็นเรื่องธรรมดาทุกวันนี้ btw
ผู้บัญชาการ Byte

1
มีคำตอบที่ดีอยู่แล้วหลายข้อ แต่มีอีกหนึ่งข้อสำหรับ libreoffice ที่ฉันสังเกตเห็น คุณสร้างไฟล์ของค่าที่คั่นด้วยเครื่องหมายจุลภาค (CSV) และบันทึกเป็น "test.csv" หน้าต่างจะเปิดขึ้นเพื่อถามว่าคุณใช้ตัวคั่นประเภทใด (เช่น libreoffice Calc) หากคุณเปลี่ยนชื่อไฟล์นี้เป็น "test.cs" ตัวอย่างเช่น Writer ของ libreoffice จะเปิดขึ้น ดังนั้นนอกเหนือจากตัวอย่าง ZIP ด้านบนดูเหมือนว่า libreoffice ใช้ประโยชน์จากไฟล์นามสกุล
Ray

3
ระบบไฟล์ linux ไม่ได้ทำอะไรเกี่ยวกับประเภทไฟล์ นั่นคือทั้งหมดที่ลงไปในโปรแกรมที่ทำงานอยู่ด้านบนของมัน
ปีเตอร์กรีน

@PeterGreen ใช่ แต่ความจริงที่ว่าโปรแกรมกำหนดอย่างมีนัยสำคัญหมายความว่ามันไม่ใช่ "สำหรับมนุษย์" อย่างเช่น MacOS แบบคลาสสิกที่มีมัน [มีสี่ประเภทไฟล์ "" และ "ผู้สร้างแอป" ที่ไม่ได้ ' ส่วนหนึ่งของชื่อไฟล์ดังนั้นระบบปฏิบัติการและแอปพลิเคชันมีข้อมูลทั้งหมดที่ต้องการโดยไม่ต้องดูที่นามสกุลไฟล์]
Random832

3
@PeterGreen ระบบไฟล์ Windows ไม่ได้ทำอะไรเกี่ยวกับประเภทไฟล์เช่นกัน เชลล์กราฟิก (Windows Explorer) ใช้นามสกุลไฟล์เพื่อเลือกการดำเนินการสำหรับดับเบิลคลิก แต่ในทางเทคนิคแล้วเป็นเพียงโปรแกรมที่ทำงานอยู่ด้านบนของระบบปฏิบัติการเช่นเดียวกับ Nautilus มันจะเป็นไปได้อย่างสมบูรณ์แบบในการเขียนตัวจัดการไฟล์ Linux ด้วยพฤติกรรมนั้นหรือ Windows ที่ตรวจสอบเนื้อหาไฟล์
IMSoP

20

ฉันต้องการใช้แนวทางที่แตกต่างจากคำตอบอื่นและท้าทายแนวคิดที่ว่า "Linux" หรือ "Windows" มีส่วนเกี่ยวข้องกับสิ่งนี้ (ทนกับฉัน)

แนวคิดของนามสกุลไฟล์สามารถแสดงเป็น "ระเบียบการระบุชนิดของไฟล์ตามส่วนของชื่อ" ข้อตกลงทั่วไปอื่น ๆ สำหรับการระบุประเภทของไฟล์กำลังเปรียบเทียบเนื้อหากับฐานข้อมูลของลายเซ็นที่รู้จัก (วิธี "หมายเลขมายากล") และจัดเก็บเป็นคุณลักษณะพิเศษในระบบไฟล์ (วิธีที่ใช้ใน MacOS ดั้งเดิม) .

เนื่องจากไฟล์ทุกไฟล์ในระบบ Windows หรือ Linux มีทั้งชื่อและเนื้อหากระบวนการที่ต้องการทราบประเภทไฟล์จึงสามารถใช้วิธี "นามสกุล" หรือ "หมายเลขมายากล" ได้ตามที่เห็นสมควร โดยทั่วไปวิธีการเมทาดาทาไม่สามารถใช้งานได้เนื่องจากไม่มีตำแหน่งมาตรฐานสำหรับแอตทริบิวต์นี้ในระบบไฟล์ส่วนใหญ่

บน Windows มีประเพณีที่แข็งแกร่งในการใช้นามสกุลไฟล์เป็นวิธีการหลักในการระบุไฟล์ อย่างชัดเจนที่สุดเบราว์เซอร์ไฟล์กราฟิก (ตัวจัดการไฟล์ใน Windows 3.1 และ Explorer ใน Windows สมัยใหม่) จะใช้เมื่อคุณดับเบิลคลิกที่ไฟล์เพื่อกำหนดแอปพลิเคชั่นที่จะเปิดตัว บน Linux (และโดยทั่วไปคือระบบที่ใช้ Unix) จะมีธรรมเนียมในการตรวจสอบเนื้อหามากขึ้น ที่สะดุดตาที่สุดเคอร์เนลดูที่จุดเริ่มต้นของไฟล์ที่เรียกใช้โดยตรงเพื่อกำหนดวิธีการรัน ไฟล์สคริปต์สามารถบ่งบอกถึงล่ามที่จะใช้โดยเริ่มต้นด้วย#!ตามด้วยเส้นทางไปที่ล่าม

ประเพณีเหล่านี้มีผลต่อการออกแบบ UI ของโปรแกรมที่เขียนขึ้นสำหรับแต่ละระบบ แต่มีข้อยกเว้นมากมายเนื่องจากแต่ละวิธีมีข้อดีข้อเสียในสถานการณ์ที่แตกต่างกัน เหตุผลในการใช้นามสกุลไฟล์มากกว่าการตรวจสอบเนื้อหา ได้แก่ :

  • การตรวจสอบเนื้อหาไฟล์นั้นค่อนข้างแพงเมื่อเทียบกับการตรวจสอบชื่อไฟล์ ตัวอย่างเช่น "ค้นหาไฟล์ทั้งหมดที่ชื่อ * .conf" จะเร็วกว่า "ค้นหาไฟล์ทั้งหมดที่มีบรรทัดแรกตรงกับลายเซ็นนี้"
  • เนื้อหาไฟล์อาจคลุมเครือ หลายรูปแบบไฟล์เป็นจริงเพียงแค่ไฟล์ข้อความที่ได้รับการรักษาด้วยวิธีพิเศษอื่น ๆ อีกมากมายเป็นไฟล์ซิปที่มีโครงสร้างพิเศษและการกำหนดลายเซ็นที่ถูกต้องสำหรับสิ่งเหล่านี้อาจเป็นเรื่องยุ่งยาก
  • ไฟล์สามารถใช้งานได้จริงมากกว่าหนึ่งประเภท ไฟล์ HTML อาจเป็น XML ที่ถูกต้องไฟล์ซิปและ GIF ที่ต่อกันจะยังคงใช้ได้สำหรับทั้งสองรูปแบบ
  • การจับคู่หมายเลขเวทย์อาจนำไปสู่การบวกเท็จ; รูปแบบไฟล์ที่ไม่มีส่วนหัวอาจเริ่มต้นด้วยไบต์ "GIF89a" และถูกระบุเป็นรูปภาพ GIF ไม่ถูกต้อง
  • การเปลี่ยนชื่อไฟล์อาจเป็นวิธีที่สะดวกในการทำเครื่องหมายว่า "ปิดการใช้งาน"; เช่นการเปลี่ยน "foo.conf" เป็น "foo.conf ~" เพื่อระบุว่าการสำรองข้อมูลทำได้ง่ายกว่าการแก้ไขไฟล์เพื่อคอมเม้นต์คำสั่งทั้งหมดและสะดวกกว่าการย้ายออกจากไดเรกทอรีที่โหลดอัตโนมัติ ในทำนองเดียวกันการเปลี่ยนชื่อไฟล์. php เป็น. txt จะบอกให้ Apache ให้บริการแหล่งที่มาเป็นข้อความธรรมดาแทนที่จะส่งผ่านไปยังโปรแกรม PHP

ตัวอย่างของโปรแกรม Linux ที่ใช้ชื่อไฟล์เป็นค่าเริ่มต้น (แต่อาจมีโหมดอื่น ๆ ):

  • gzip และ gunzip มีการจัดการไฟล์ใด ๆ ที่ลงท้ายด้วย ".gz" เป็นพิเศษ
  • gcc จะจัดการไฟล์ ".c" เป็น C และ ".cc" หรือ ".C" เป็น C ++

Windows ยังมีประเพณีที่แข็งแกร่งในการซ่อนนามสกุลถ้าเป็น "ที่รู้จักกันดี" และแม้แต่ DOS ก็อนุญาตให้สั่งให้ละเว้น. COM, .BAT และ. EXE โดยอัตโนมัติค้นหาสิ่งเหล่านั้นเพื่อพิจารณาว่าโปรแกรมจริงที่จะดำเนินการ ไม่มีประเพณีดังกล่าวใน * ระวัง
Monty Harder

นี่เป็นคำตอบที่ดีกว่า แต่มีข้อผิดพลาดที่เกิดขึ้นจริง ... สคริปต์ไม่สามารถเรียกใช้งานได้โดยวางไว้#!ที่จุดเริ่มต้น ไฟล์ใด ๆ ที่มีชุดบิตที่สามารถเรียกใช้งานสามารถดำเนินการได้หลายวิธี #!/bin/bashและลายเซ็นที่คล้ายกันเพียงระบุล่ามที่จะใช้ หากไม่มีการระบุลายเซ็นดังกล่าวจะถือว่ามีการใช้ตัวแปลเชลล์เริ่มต้น ไฟล์ที่ไม่มีอะไรนอกจากคำสองคำว่า 'Hello World' แต่ด้วยการตั้งค่าบิตเรียกใช้งานจะพยายามค้นหาคำสั่ง 'Hello' เมื่อเรียกใช้
DocSalvager

1
@DocSalvager จับดีนั่นเป็นถ้อยคำที่ซุ่มซ่ามมากเท่ากับอะไร ฉันได้รับคำพูดเล็กน้อยเพื่อให้ชัดเจนว่า shebang ไม่ได้ทำให้สคริปต์ทำงานได้มันแค่เปลี่ยนวิธีการดำเนินการ
IMSoP

15

ที่จริงแล้วเทคโนโลยีบางอย่างนั้นใช้นามสกุลไฟล์ดังนั้นถ้าคุณใช้เทคโนโลยีเหล่านั้นใน Ubuntu คุณก็ต้องพึ่งนามสกุลด้วยเช่นกัน ตัวอย่างบางส่วน:

  • gccใช้ส่วนขยายเพื่อแยกความแตกต่างระหว่างไฟล์ C และ C ++ หากไม่มีส่วนขยายคุณจะไม่สามารถแยกความแตกต่างได้ (ลองนึกภาพไฟล์ C ++ ที่ไม่มีคลาส)
  • ไฟล์จำนวนมาก ( docx, jar, apk) เป็นเพียงโครงสร้างโดยเฉพาะอย่างยิ่งที่เก็บรหัสไปรษณีย์ แม้ว่าโดยปกติคุณสามารถอนุมานชนิดจากเนื้อหา แต่อาจไม่สามารถทำได้เสมอไป (เช่น Java Manifest เป็นตัวเลือกในjarไฟล์)

การไม่ใช้นามสกุลไฟล์ในกรณีดังกล่าวจะทำได้เฉพาะกับการแก้ไขปัญหาแฮ็คและมีแนวโน้มที่จะเกิดข้อผิดพลาดได้ง่ายมาก


ดีสำหรับคุณที่พูดถึงการเขียนโปรแกรม แต่คุณได้รับรายละเอียดส่วนใหญ่ผิด gccเป็น front-end สำหรับไฟล์ C สำหรับไฟล์ C ++ คุณต้องใช้g++front-end หรือสวิตช์บรรทัดคำสั่งเพื่อระบุภาษา ที่สำคัญกว่านั้นคือmakeโปรแกรมที่ตัดสินใจว่าจะใช้gccหรือg++สร้างไฟล์ใดไฟล์หนึ่งและmakeขึ้นอยู่กับรูปแบบชื่อไฟล์ (นามสกุลส่วนใหญ่) สำหรับการจับคู่กฎ
Ben Voigt

@BenVoigt เมื่อทำการคอมไพล์ไฟล์ที่มี.ccนามสกุลด้วยgccจริงๆมันจะถูกคอมไพล์เป็น C ++ และจะมีการบันทึกไว้ในman gcc: "สำหรับไฟล์อินพุตที่กำหนดคำต่อท้ายชื่อไฟล์จะกำหนดชนิดของการคอมไพล์ที่จะทำ:" ตามด้วยรายการ ส่วนขยายและวิธีการใช้งาน
hvd

1
@hvd แล้วอาจเป็นชุดเริ่มต้นของไลบรารีที่ผิดพลาดอย่างรุนแรงหากคุณไม่ใช้ส่วนหน้าขวา อย่างไรก็ตามการทำเช่นนั้นเป็นตัวอย่างที่ดีเพราะทุกอย่างมันทำขึ้นกับนามสกุลไฟล์
Ben Voigt

1
@BenVoigt makeก็เป็นตัวอย่างที่ดีเช่นกัน แต่gccต้องอาศัยชื่อไฟล์เป็นอย่างมาก นี่คือตัวอย่างที่ชัดเจนกว่า.cvs .cc: สำหรับ C ให้gccใช้คำต่อท้ายเพื่อบอกว่าขั้นตอนแรกคือ preprocess ( .c), compile ( .i), assemble ( .s), หรือ link ( .o) นี่ผมใช้-E, -Sและ-cที่จะบอกgccว่าจะหยุดแต่จะใช้ชื่อไฟล์จะทราบว่าจะเริ่มต้น gcc something.ccจะไม่เชื่อมโยงไปยังไลบรารีที่ถูกต้องสำหรับ C ++ แต่จะถือว่าไฟล์เป็น C ++ ซึ่งเป็นสาเหตุที่ผู้ใช้หลายคนสับสนโดยข้อความแสดงข้อผิดพลาดที่พวกเขาได้รับเมื่อทำผิดพลาด
Eliah Kagan

7

ข้อสันนิษฐานแรกของคุณถูกต้อง: ส่วนขยายบน Linux ไม่สำคัญและมีประโยชน์สำหรับมนุษย์เท่านั้น (และระบบปฏิบัติการอื่นที่ไม่ใช่ Unix เหมือนที่ดูแลส่วนขยาย) ประเภทของไฟล์ถูกกำหนดโดยข้อมูล 32 บิตแรกในไฟล์ซึ่งเรียกว่าหมายเลขมายากล นี่คือเหตุผลที่เชลล์สคริปต์ต้องการ#!บรรทัด - เพื่อบอกระบบปฏิบัติการว่าจะให้ล่ามแปลว่าอะไร หากไม่มีมันเชลล์สคริปต์จะเป็นเพียงไฟล์ข้อความ

เท่าที่ผู้จัดการไฟล์ดำเนินไปพวกเขาต้องการทราบว่าส่วนขยายของไฟล์บางไฟล์เช่น.desktopไฟล์ซึ่งโดยทั่วไปเหมือนกับทางลัดเวอร์ชันของ Window แต่มีความสามารถมากขึ้น แต่สำหรับระบบปฏิบัติการที่เกี่ยวข้องมันจำเป็นต้องรู้ว่ามีอะไรอยู่ในไฟล์ไม่ใช่สิ่งที่อยู่ในชื่อ


3
สิ่งนี้ไม่เป็นความจริงเลย มีโปรแกรมที่คาดว่าจะมีการขยายเฉพาะ ตัวอย่างที่ใช้กันมากที่สุดน่าจะเป็นที่จะไม่ขยายไฟล์ถ้ามันไม่ได้เรียกว่าgunzip foo.gz
terdon

นั่นคือการใช้งานซอฟต์แวร์เฉพาะ ส่วนใหญ่ยูทิลิตี้สำหรับระบบที่เหมือนยูนิกซ์จะไม่คาดหวังส่วนขยาย
Sergiy Kolodyazhnyy

7
ส่วนใหญ่พวกเขาทำไม่ได้ อย่างไรก็ตามประโยคแรกของคุณอ้างว่าพวกเขาไม่เคยใช้และมีความสำคัญกับมนุษย์เท่านั้น นั่นไม่จริงทั้งหมด gunzipเป็นตัวอย่างหนึ่งเป็นอีกตัวอย่างeogหนึ่ง นอกจากนี้เครื่องมือจำนวนมากจะไม่เติมชื่อให้สมบูรณ์โดยอัตโนมัติหากไม่มีนามสกุลที่ถูกต้อง ทั้งหมดที่ฉันพูดคือมันซับซ้อนกว่า "ส่วนขยายที่ไม่เกี่ยวข้องเสมอ"
terdon

1
1 ปัญหาเล็ก ๆ : OP ถามเกี่ยวกับระบบปฏิบัติการ 'gunzip' และ 'eog' ไม่ใช่ระบบปฏิบัติการ แต่ตัดสินใจที่จะสร้างข้อ จำกัด ของตัวเอง (ในกรณีของ gunzip) หรือวิธีการ (eog) "ประเภท mime" แม้ว่า
Rinzwind

1
@Serg แน่นอนว่าคุณสามารถกำหนด OS ได้อย่างหวุดหวิดและรับคำตอบเล็กน้อยสำหรับคำถาม ไม่ใช่คำตอบที่มีประโยชน์เป็นพิเศษเพราะส่วนใหญ่ของสิ่งที่ผู้ใช้ทำกับคอมพิวเตอร์เกี่ยวข้องกับซอฟต์แวร์ที่คุณยกเว้น โปรดทราบว่าคำถามนั้นตรงกันข้ามกับ "สำหรับมนุษย์เท่านั้น" กับ "ระบบปฏิบัติการ"; ฉันไม่คิดว่าพวกเขาหมายถึง "เคอร์เนล"
IMSoP

6

นี่มันใหญ่เกินไปสำหรับคำตอบความคิดเห็น

โปรดทราบว่าแม้ "ส่วนขยาย" ก็มีความหมายที่แตกต่างกัน

สิ่งที่คุณพูดถึงดูเหมือนจะเป็น 3 ตัวอักษรหลังจากนั้น DOS ทำให้รูปแบบ 8.3 เป็นที่นิยมมากและ windows ใช้ส่วน. 3 จนถึงทุกวันนี้

Linux มีไฟล์จำนวนมากเช่น. conf หรือ. list หรือ. d หรือ. c ที่มีความหมาย แต่ไม่ได้ขยายในความรู้สึก 8.3 ตัวอย่างเช่น Apache ดูที่ /etc/apache2/sites-enabled/website.conf เพื่อดูคำสั่งการกำหนดค่า ในขณะที่ระบบใช้ประเภท MIME และส่วนหัวของเนื้อหาและสิ่งที่ไม่ได้ระบุว่าเป็นไฟล์ข้อความ Apache (โดยค่าเริ่มต้น) ยังคงไม่โหลดโดยไม่สิ้นสุดใน. conf

.c เป็นอีกหนึ่งที่ยอดเยี่ยม ใช่มันเป็นไฟล์ข้อความ แต่ gcc ขึ้นอยู่กับ main.c กลายเป็น main.o และในที่สุดก็หลัก (หลังจากการเชื่อมโยง) ในเวลาไม่นานระบบจะใช้. c, .o หรือส่วนขยายที่ไม่มีเพื่อให้มีความหมายใด ๆ กับเนื้อหา แต่เป็นเนื้อหาหลังจาก มีความหมายบางอย่าง คุณอาจตั้งค่า SCM ของคุณให้ละเว้น main.o และ main

สิ่งที่เป็นอยู่นี้คือ: ส่วนขยายไม่ได้ใช้อย่างที่เป็นใน windows เคอร์เนลจะไม่เรียกใช้งานไฟล์. txt เนื่องจากคุณลบส่วน. txt ของชื่อออก นอกจากนี้ยังยินดีเป็นอย่างยิ่งที่จะเรียกใช้งานไฟล์. txt หากมีการตั้งค่าการอนุญาตให้ใช้งาน ที่ถูกกล่าวว่าพวกเขามีความหมายและยังคงใช้ใน "คอมพิวเตอร์ระดับ" สำหรับหลายสิ่ง


1
Windows จะยังไม่ได้ผูกไว้กับx.3โครงการตั้งชื่อใด ๆ เพิ่มเติมคุณมีส่วนขยายได้อยู่ที่นั่นด้วยเช่น.doxc, .torrent, .partฯลฯ มันเป็นเพียงแค่ว่ารูปแบบไฟล์จำนวนมากและส่วนขยายที่ถูกกำหนดไว้แล้วกลับมาในเวลาที่ 8.3 การตั้งชื่อก็ยังคงเป็นสิ่งที่และต่อมา รูปแบบส่วนใหญ่ปรับการประชุมโดยใช้ตัวอักษรสูงสุด 3 ตัว
ผู้บัญชาการ Byte

ฉันไม่เห็นว่า ".conf", ".c" ฯลฯ เป็นอย่างไร "ความหมายที่แตกต่าง" จาก "ความรู้สึก 8.3" แนวคิดของส่วนขยายไฟล์สามารถแสดงเป็น "ระเบียบแบบแผนสำหรับการระบุประเภทของไฟล์ตามส่วนของชื่อ" ไม่แม้แต่ DOS / Win3.1 จำเป็นต้องใช้ส่วนขยายที่ถูกต้อง (คุณสามารถเรียกเอกสาร Word "STUPIDN.AME" และเปิดด้วย Ctrl-O ใน WinWord) เป็นเพียงระบบบางระบบ (เช่นดับเบิลคลิกบน Windows, gzipMakefile ของคุณ ฯลฯ ) อาจถูกเขียนขึ้นเพื่อใช้แบบแผนนี้เพื่อกำหนดสมมติฐานเกี่ยวกับการกระทำที่ถูกต้องในแต่ละไฟล์
IMSoP

@ByteCommander เป็นเรื่องจริง แต่ส่วนขยายยังคงเป็นตัวกำหนดแอปที่ใช้ ฉันไม่แน่ใจว่าจะแก้ไขคำตอบอย่างไร
coteyr

1
@coteyr อีกครั้งทุกอย่างขึ้นอยู่กับสิ่งที่เราหมายถึงโดย "ระบบปฏิบัติการ" จัดการไฟล์อย่างแน่นอนจะมองขึ้นรีจิสทรีคีย์สำหรับ "AME" และจะบอกผมว่า "foo.txt" เป็นแฟ้มข้อความ แต่การรันdirที่พรอมต์คำสั่งจะไม่บอกฉันเลย มันก็จะไม่สนใจ การเรียกใช้ไฟล์เป็นข้อยกเว้นอย่างแน่นอนในทั้งสองระบบปฏิบัติการ ถ้าคำถามนั้นถูก จำกัด อยู่ที่คำตอบก็คือว่า DOS / Windows จะสนใจเฉพาะชื่อเท่านั้นและ Unix / Linux จะสนใจเฉพาะสิทธิ์ในการดำเนินการและไบต์แรกของไฟล์เท่านั้น นอกเหนือจากนั้นยังมีแอปพลิเคชันบางตัวที่เลือกการประชุมที่จะทำตาม
IMSoP

1
@coteyr คุณลืม * .scr (โปรแกรมรักษาหน้าจอไบนารี) ใน Windows 3.1 ขึ้นไป ที่กล่าวว่าไฟล์นามสกุลแม้ในระบบ DOS / Windows แม้สำหรับปฏิบัติการก็ยังคงเป็นเพียงความสะดวกสบาย ข้อมูลเฉพาะนั้นขึ้นอยู่กับที่คุณวาดเส้นของ "ระบบปฏิบัติการ" แต่คุณสามารถโหลดไบนารีลงในหน่วยความจำและกระโดดเข้าสู่ตัวคุณเองได้โดยทำผลงานที่ระบบปฏิบัติการขอให้ทำ ใน MS-DOS ถ้าคุณดูคอมมิชชันฉันค่อนข้างแน่ใจว่ามีรายการเช่น EXE COM ที่คุณสามารถแก้ไขได้เพื่อให้มันดูส่วนขยายอื่น ๆ หากไม่มีการระบุไว้ (ไม่ได้บอกว่ามันเป็นความคิดที่ดี ใจคุณ)
CVn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.