O Linux determina o tipo de um arquivo por meio de um código no cabeçalho do arquivo. Não depende de extensões de arquivo para saber qual software deve ser usado para abrir o arquivo.
É disso que lembro da minha educação. Por favor, me corrija caso eu esteja errado!
Trabalhando um pouco com sistemas Ubuntu recentemente: Eu vejo um monte de arquivos nos sistemas que têm extensões como .sh
, .txt
, .o
,.c
Agora, estou me perguntando: essas extensões são destinadas apenas a humanos? Para que se tenha uma idéia de que tipo de arquivo é?
Ou eles também têm algum objetivo para o sistema operacional?
files
file-format
mime-type
mizech
fonte
fonte
gzip
,bzip2
,xz
- e assim por diante. Esses programas usam sufixos para separar a versão compactada de um arquivo da versão não compactada que eles substituem. Os programas de compactação costumam reclamar de sufixos incorretos, mesmo que o arquivo seja realmente um arquivo compactado do tipo que ele deve manipular.Respostas:
Quando você interage com outros sistemas operacionais que dependem de extensões, o ideal é usá-las.
No Windows, o software de abertura está anexado às extensões.
Abrir um arquivo de texto chamado "arquivo" é mais difícil no Windows do que abrir o mesmo arquivo "arquivo.txt" (será necessário alternar a caixa de diálogo de abertura do arquivo
*.txt
para*.*
sempre). O mesmo vale para arquivos de texto separados por TAB e ponto-e-vírgula. O mesmo vale para importar e exportar emails (extensão .mbox).Em particular quando você codifica software. Abrir um arquivo chamado "software1", que é um arquivo HTML, e "software2", que é um arquivo JavaScript, se torna mais difícil em comparação com "software.html" e "software.js".
Se existe um sistema no Linux em que as extensões de arquivo são importantes, eu chamaria isso de bug. Quando o software depende das extensões de arquivo, isso é explorável. Utilizamos uma diretiva de intérprete para identificar o que é um arquivo ("os dois primeiros bytes de um arquivo podem ser os caracteres" #! ", Que constituem um número mágico (hexadecimal 23 e 21, os valores ASCII de" # "e"! ") geralmente chamado de shebang").
O problema mais famoso com extensões de arquivo foi LOVE-LETTER-FOR-YOU.TXT.vbs no Windows. Este é um script visual básico sendo mostrado no explorador de arquivos como um arquivo de texto.
No Ubuntu, quando você inicia um arquivo do Nautilus, recebe um aviso sobre o que ele fará. A execução de um script do Nautilus, onde ele deseja iniciar algum software onde ele deve abrir o gEdit, é obviamente um problema e recebemos um aviso sobre isso.
Na linha de comando, quando você executa algo, pode ver visualmente qual é a extensão. Se terminar em .vbs, eu começaria a suspeitar (não que .vbs seja executável no Linux. Pelo menos não sem mais esforço;)).
fonte
readme.txt
e o torna executável. Se o usuário o executou, ele não abre o editor, mas executa o código. Nesse sentido, tornar as extensões importantes (mas não escondê-las) é mais seguro e fácil de explicar para usuários não experientes. Existem outras diferenças (principalmente a execução de arquivos do diretório atual), mas elas não têm nada a ver com extensões.readme.txt
arquivo com um editor de texto. Eu apenas tentei com o dolphin no KDE, criando um shell script adicionando permissão executável, salvando-o como.txt
e clicando nele para abrir o Kate. Se eu renomeá-lo para.sh
clicar nele, ele será executado.file
é baseado em heurística, não é definitivo.Não há resposta 100% em preto ou branco aqui.
Normalmente, o Linux não depende de nomes de arquivo (e extensões de arquivo, ou seja, a parte do nome do arquivo após o último período normalmente) e, em vez disso, determina o tipo de arquivo examinando os primeiros bytes de seu conteúdo e comparando-o a uma lista de números mágicos conhecidos. .
Por exemplo, todos os arquivos de imagem de bitmap (geralmente com extensão de nome
.bmp
) devem começar com as letrasBM
nos dois primeiros bytes. Os scripts na maioria das linguagens de script como Bash, Python, Perl, AWK etc. (basicamente tudo o que trata linhas que começam com#
como comentário) podem conter um shebang#!/bin/bash
como a primeira linha. Este comentário especial informa ao sistema com qual aplicativo abrir o arquivo.Portanto, normalmente o sistema operacional depende do conteúdo do arquivo e não de seu nome para determinar o tipo de arquivo, mas afirmar que extensões de arquivo nunca são necessárias no Linux é apenas metade da verdade.
É claro que os aplicativos podem implementar suas verificações de arquivos da maneira que desejarem, o que inclui a verificação do nome e da extensão do arquivo. Um exemplo é o Eye of Gnome (
eog
visualizador de imagens padrão) que determina o formato da imagem pela extensão do arquivo e gera um erro se não corresponder ao conteúdo. Se isso é um bug ou um recurso pode ser discutido ...No entanto, mesmo algumas partes do sistema operacional contam com extensões de nome de arquivo, por exemplo, ao analisar os arquivos de origem do software,
/etc/apt/sources.list.d/
apenas os arquivos com a*.list
extensão são analisados e todos os outros são ignorados. Talvez não seja usado principalmente para determinar o tipo de arquivo aqui, mas para ativar / desativar a análise de alguns arquivos, mas ainda é uma extensão que afeta a maneira como o sistema trata um arquivo.E, claro, os lucros usuário humano máximo de extensões de arquivo como que faz com que o tipo de um arquivo óbvio e também permite que vários arquivos com o mesmo nome de base e diferentes extensões como
site.html
,site.php
,site.js
,site.css
etc. A desvantagem é, naturalmente, que a extensão de arquivo e o real o tipo / conteúdo do arquivo não precisa necessariamente corresponder.Além disso, é necessário para interoperabilidade entre plataformas, como por exemplo, o Windows não saberá o que fazer com um
readme
arquivo, mas apenas umreadme.txt
.fonte
#!
Tudo o resto é até a decisão de algum aplicativo..eog
e eu não sei por que eles se preocupam com o nome do arquivo em tudo. Este é um erro na minha opinião. E, é claro, se o arquivo for nomeado "bmp", mas seu formato de conteúdo não corresponder, também haverá um erro, é claro. É claro que cada aplicativo decide como verificar os arquivos, mas, em geral, os aplicativos Linux não devem confiar no nome. Aliás, você pode usar ofile
elogio para examinar os tipos de arquivo pelo seu conteúdo.file
utilitário realmente não prova nada; é uma ferramenta útil, que poderia existir em qualquer sistema operacional. Que parte fundamental do sistema operacional torna a execuçãofile
mais "correta" do que globbing no nome do arquivo?Conforme mencionado por outros, no Linux, um método de diretiva de intérprete é usado (armazenando alguns metadados em um arquivo como um cabeçalho ou número mágico, para que o intérprete correto seja instruído a lê-lo), em vez do método de associação de extensão de nome de arquivo usado pelo Windows.
Isso significa que você pode criar um arquivo com quase qualquer nome que desejar ... com algumas exceções
Contudo
Gostaria de acrescentar uma palavra de cautela.
Se você tiver alguns arquivos no sistema de um sistema que usa associação de nome de arquivo, os arquivos podem não ter esses números mágicos ou cabeçalhos. As extensões de nome de arquivo são usadas para identificar esses arquivos por aplicativos capazes de lê-los, e você poderá experimentar alguns efeitos inesperados se renomear esses arquivos. Por exemplo:
Se você renomear um arquivo
My Novel.doc
paraMy-Novel
, o Libreoffice ainda poderá abri-lo, mas será aberto como 'Sem título' e você precisará nomeá-lo novamente para salvá-lo (o Libreoffice adiciona uma extensão por padrão, então você terá dois arquivosMy-Novel
eMy-Novel.odt
, o que pode ser irritante)Mais seriamente, se você renomear um arquivo My Spreadsheet.xlsx para My-Spreadsheet, tente abri-lo e
xdg-open My-Spreadsheet
você obterá isso (porque na verdade é um arquivo compactado):E se você renomear um arquivo
My Spreadsheet.xls
paraMy-Spreadsheet
, quandoxdg-open My-Spreadsheet
receber um erro dizendo(Embora em ambos os casos funcione bem se você o fizer
soffice My-Spreadsheet
)Se você renomear o arquivo sem extensão para
My-Spreadsheet.ods
withmv
e tentar abri-lo, obterá o seguinte:(falha no reparo)
E você terá que colocar a extensão original novamente para abrir o arquivo corretamente (você pode converter o formato, se desejar)
TL; DR:
Se você tiver arquivos não nativos com extensões de nome, não remova as extensões assumindo que tudo ficará bem!
fonte
Eu gostaria de ter uma abordagem diferente para isso de outras respostas e desafiar a noção de que "Linux" ou "Windows" têm algo a ver com isso (tenha paciência comigo).
O conceito de extensão de arquivo pode ser simplesmente expresso como "uma convenção para identificar o tipo de arquivo com base em parte de seu nome". As outras convenções comuns para identificar o tipo de um arquivo estão comparando seu conteúdo com um banco de dados de assinaturas conhecidas (a abordagem "número mágico") e armazenando-o como um atributo extra no sistema de arquivos (a abordagem usada no MacOS original) .
Como todo arquivo em um sistema Windows ou Linux possui um nome e um conteúdo, os processos que desejam conhecer o tipo de arquivo podem usar as abordagens "extensão" ou "número mágico", conforme entenderem. A abordagem de metadados geralmente não está disponível, pois não há um local padrão para esse atributo na maioria dos sistemas de arquivos.
No Windows, existe uma forte tradição de usar a extensão de arquivo como o principal meio de identificar um arquivo; de maneira mais visível, o navegador de arquivos gráficos (Gerenciador de Arquivos no Windows 3.1 e Explorer no Windows moderno) o utiliza quando você clica duas vezes em um arquivo para determinar qual aplicativo iniciar. No Linux (e, geralmente, em sistemas baseados em Unix), há mais tradição para inspecionar o conteúdo; mais notavelmente, o kernel examina o início de um arquivo executado diretamente para determinar como executá-lo; os arquivos de script podem indicar um intérprete a ser usado, iniciando com
#!
seguido pelo caminho para o intérprete.Essas tradições influenciam o design da interface do usuário dos programas escritos para cada sistema, mas há muitas exceções, porque cada abordagem tem prós e contras em diferentes situações. Os motivos para usar extensões de arquivo em vez de examinar o conteúdo incluem:
Exemplos de programas Linux que usam nomes de arquivos por padrão (mas podem ter outros modos):
fonte
#!
-o no início. Qualquer arquivo com seu conjunto de bits executáveis pode ser executado de uma de várias maneiras.#!/bin/bash
e assinaturas semelhantes apenas especificam qual intérprete usar. Se nenhuma assinatura for fornecida, o interpretador de shell padrão será assumido. Um arquivo contendo nada além das duas palavras 'Hello World', mas com o bit de execução definido, tentará encontrar um comando 'Hello' quando executado.Na verdade, algumas tecnologias que dependem de extensões de arquivos, então se você usar essas tecnologias em Ubuntu, você tem que confiar em extensões também. Alguns exemplos:
gcc
usa extensões para distinguir entre arquivos C e C ++. Sem a extensão, é praticamente impossível diferenciá-las (imagine um arquivo C ++ sem classes).docx
,jar
,apk
) estão apenas particularmente estruturado arquivos ZIP. Embora você normalmente possa inferir o tipo do conteúdo, nem sempre isso é possível (por exemplo, o Java Manifest é opcional nosjar
arquivos).O não uso de extensões de arquivo nesses casos só será possível com soluções alternativas de hackers e provavelmente será muito propenso a erros.
fonte
gcc
é o front-end para arquivos C; para arquivos C ++, é necessário og++
front-end ou uma opção de linha de comando para especificar o idioma. Mais importante é omake
programa que decide se deve usargcc
oug++
criar um arquivo específico - emake
é completamente dependente dos padrões de nome de arquivo (principalmente extensões) para sua correspondência de regras..cc
extensãogcc
, ele realmente será compilado como C ++, e isso está documentado emman gcc
: "Para qualquer arquivo de entrada, o sufixo do nome do arquivo determina que tipo de compilação é feita:" seguido por uma lista de extensões e como elas são tratadas.make
é um bom exemplo, masgcc
depende muito dos nomes de arquivos. Aqui está um exemplo mais claro que.c
vs.cc
: para C,gcc
usa sufixos para dizer se o primeiro passo é pré-processar (.c
), compilar (.i
), montar (.s
) ou vincular (.o
). Aqui, eu uso-E
,-S
e-c
para dizergcc
onde parar , mas ele usa nomes de arquivos para saber onde começar .gcc something.cc
não vão ligar para as bibliotecas certas para C ++, mas ele vai tratar o arquivo como C ++, que é por isso que muitos usuários estão confusos com as mensagens de erro que recebem ao fazer esse erro.Sua primeira suposição está correta: as extensões no Linux não importam e são úteis apenas para humanos (e para outros SOs não semelhantes ao Unix que se preocupam com extensões). O tipo de um arquivo é determinado pelos primeiros 32 bits de dados no arquivo, conhecido como número mágico. É por isso que os scripts de shell precisam de
#!
linha - para informar ao sistema operacional qual intérprete chamar. Sem ele, o shell script é apenas um arquivo de texto.No que diz respeito aos gerenciadores de arquivos, eles querem conhecer extensões de alguns arquivos, como
.desktop
arquivos, que são basicamente os mesmos da versão de atalhos do Windows, mas com mais recursos. Mas, no que diz respeito ao sistema operacional, ele precisa saber o que está no arquivo, não o que está em seu nomefonte
gunzip
que não descompacta um arquivo se não for chamadofoo.gz
.gunzip
é um exemplo,eog
é outro. Além disso, muitas ferramentas não completam automaticamente os nomes sem a extensão correta. Tudo o que estou dizendo é que é um pouco mais complicado do que "extensões são sempre irrelevantes".Isso é muito grande para uma resposta de comentário.
Lembre-se de que mesmo "extensão" tem muitos significados diferentes.
O que você está falando parece ser as três letras após o. O DOS tornou o formato 8.3 muito popular e o Windows usa a parte .3 até hoje.
O Linux tem muitos arquivos como .conf ou .list ou .d ou .c que têm significado, mas não são realmente extensões no sentido 8.3. Por exemplo, o Apache observa /etc/apache2/sites-enabled/website.conf a sua diretiva de configuração. Enquanto o sistema usa tipos MIME e cabeçalhos de conteúdo e o que não determinar, é um arquivo de texto, mas o Apache (por padrão) ainda não o carregará sem terminar em .conf.
.c é outro ótimo. Sim, é um arquivo de texto, mas o gcc depende de main.c se tornar main.o e finalmente main (após o link). Em nenhum momento o sistema usa a extensão .c, .o ou nenhuma extensão para ter algum significado no que diz respeito ao conteúdo, mas as coisas após a. tem algum significado. Você provavelmente configuraria seu SCM para ignorar main.o e main.
O ponto principal é o seguinte: as extensões não são usadas como são nas janelas. O kernel não executará um arquivo .txt porque você remove a parte .txt do nome. Também é muito prazer executar um arquivo .txt se a permissão de execução estiver definida. Dito isto, eles têm significado e ainda são usados no "nível do computador" para muitas coisas.
fonte
x.3
esquema de nomenclatura todas as extensões mais longas mais, você tem lá, bem como.doxc
,.torrent
,.part
, etc. É que muitos formatos de arquivo e extensões foram já definidas para trás no momento em que nomes 8.3 ainda era uma coisa e depois os formatos simplesmente adaptaram a convenção de usar até 3 letras.gzip
seu Makefile etc.) podem ser escritos para usar esta convenção para fazer suposições sobre a ação correta a ser executada em cada arquivo.dir
em um prompt de comando não me diz nada disso; simplesmente não se importa. A execução de arquivos é certamente uma exceção nos dois sistemas operacionais; se a pergunta fosse limitada a eles, a resposta seria que o DOS / Windows se preocupa apenas com o nome e o Unix / Linux se importa apenas com a permissão de execução e os primeiros bytes do arquivo. Fora isso, sempre há algum aplicativo que escolhe uma convenção a seguir.