Por que não tornar o arquivo .txt executável em vez do arquivo .sh para executar scripts?

18

Eu queria saber qual é a necessidade de colocar comandos executáveis ​​dentro de um .sharquivo para criar um único script, pois eu posso fazer o mesmo colocando os comandos dentro de um .txtarquivo e tornando-o executável usando chmod.

Suponho que isso possa ser feito com qualquer uma das extensões de arquivo. Então, estou bastante confuso sobre a necessidade de .shextensão. Qualquer ajuda seria muito apreciada.

Abhik Bhattacharjee
fonte
19
O Unix tradicionalmente não se importa com extensões de arquivo. Então você está correto - isso não importa. É apenas para tornar óbvio para o leitor que é um script de shell
#
8
As extensões de arquivos no Linux não são usadas pelo sistema operacional de maneira real. Colocar uma extensão .sh simplesmente informa ao usuário que é um script shell, em oposição a algum outro tipo de arquivo, como um script python ou perl. Pessoalmente, não coloco extensões nos meus scripts.
Doneal24
2
É necessário apenas dizer a você ou a qualquer outra pessoa que o veja que é um script de shell. Se você não se importa em dizer quais arquivos .txt são scripts a serem executados e quais são os textos a serem abertos em um editor, fique à vontade para nomear tudo .txt!
Daboross
2
Right.txt, but.txt if.txt everything.txt termina.txt com.txt the.txt .txt.txt suffix.txt, você é.txt not.txt ajudando.txt a si mesmo.txt (ou.txt anybody.txt else .txt) compreensão.txt what.txt cada.txt arquivo.txt é.txt lá.txt para.txt.
leftaroundabout
11
Isso é semelhante à questão da qual essa é uma suposta duplicata, mas essa questão não responde a essa.
Kenny Evitt 02/05

Respostas:

47

Não há necessidade de a extensão do arquivo corresponder a algo específico, como você descobriu corretamente.

Em sistemas tipo Unix, os tipos de arquivo geralmente são derivados do conteúdo do arquivo (ou seja, o "número mágico" ou outras estruturas características nos primeiros bytes) e não do nome. Você também pode omitir completamente a extensão, o que geralmente é feito para executáveis.

Verifique o filecomando, ele mostra as informações que você pode descobrir sobre um tipo de arquivo a partir do seu conteúdo.

Para um script executável, o sistema espera um chamado "shebang" na primeira linha, que se parece, por exemplo, com

#!/usr/bin/env python3

e indica qual programa executar como intérprete com o arquivo de script como argumento. Se você executar um arquivo de texto sem tal shebang, ele usará seu shell padrão, ou seja, o Bash para tentar interpretá-lo.

Portanto, nos sistemas Unix / Linux, as extensões de nome de arquivo são principalmente uma dica (mas nenhuma garantia) para o usuário humano reconhecer rapidamente o que esperar que um arquivo específico contenha. Também é uma convenção que pode ajudar, por exemplo, a encontrar arquivos mais rapidamente.

Observe que existem algumas exceções, onde o nome e a extensão são importantes (por exemplo, alguns arquivos de configuração do sistema que devem seguir uma convenção de nomenclatura, ou muitos visualizadores e editores de imagens também exigem a extensão para indicar o tipo de arquivo).

Você também pode dar uma olhada em As extensões de arquivo têm algum objetivo (para o sistema operacional)?

Byte Commander
fonte
3
As extensões de arquivo não importam em um shell, mas em um mundo de sistemas operacionais da GUI, você precisa delas para que o clique duplo funcione corretamente.
BallpointBen
@ BallpointBen os dois pontos não estão relacionados. Mesmo sob uma GUI, o "tipo" de um arquivo pode ser armazenado ao lado, como metadados, e pode disparar uma execução específica, independentemente da extensão. MacOS não têm nomes de arquivos extensões e é um GUI e sobrevive muito bem ...
Patrick Mevzek
11
@PatrickMevzek como o Dows MacOS não possui extensões? Eu ativei exibi-los e todos os arquivos têm. Estou esquecendo de algo ? Eu sou novo na plataforma MacOS
Ciprian Tomoiagă
11
@ CiprianTomoiagă você pode nomear seus arquivos da maneira que quiser, o sistema operacional não precisa da extensão para funcionar corretamente neles. Veja por exemplo: howtogeek.com/192628/…
Patrick Mevzek
11
@barbecue visando o menor denominador comum ... o que pode dar errado com isso :-) (como ataques através de arquivos anexados por email chamados something.com.txt e fazendo truques para pular o .txt como .com como significado específico no Windows-land ) De fato, para extensões de arquivo de interoperabilidade pode ser uma boa prática. É preciso aprender, no entanto, que esse é claramente um defeito introduzido pelo DOS e que vários sistemas operacionais vivem perfeitamente felizes com arquivos sem extensões.
Patrick Mevzek
3

Não existe um arquivo "extensão" ou "tipo" em um nome de arquivo UNIX / Linux.

Como outros já apontaram, o "tipo" pode ser encontrado usando o comando file, assumindo que a mágica relevante esteja disponível no seu sistema. Os nomes de arquivo UNIX / Linux normalmente podem conter qualquer caractere disponível, mas geralmente é útil usar alguma forma de convenção para o nome, para que humanos e máquinas possam julgar o conteúdo (e, portanto, o uso do conteúdo).

Como exemplo, costumo usar uma vírgula como primeiro caractere do nome do arquivo para indicar um arquivo temporário, em vez de usar algo como a sequência ".tmp" no final do nome do arquivo. O resultado é o mesmo, um arquivo contendo dados que são necessários apenas por um curto período, talvez, mas o nome não precisa ter um "." dentro dele nem a string "tmp". Às vezes, isso pode ter vantagens, por exemplo, ao analisar uma lista de nomes de arquivos. Mas é minha convenção e outra pessoa pode decidir sobre outra pessoa, mesmo usando ".tmp" como convenção de um nome para um arquivo temporário.

Portanto, minha resposta é que não existe uma extensão de arquivo UNIX / Linux apenas um conjunto de convenções que normalmente se parecem com as extensões de arquivo usadas em outros sistemas operacionais e seus sistemas de arquivos.

PJF
fonte
FWIW, eu também uso uma convenção não padrão para mim. Meus scripts cujos nomes começam com "."devem ser pontilhados pelo shell (eles não podem ser executados de maneira significativa em um subshell). Do mesmo modo, desabilito a convenção padrão "ponto inicial = arquivo oculto" em meus aliases / scripts que são usados lspara que eu possa ver todos os arquivos, incluindo os "ocultos". Da mesma forma, no Windows, desabilito a configuração "ocultar extensões de arquivo".
Jrw32982 suporta Monica #