Pourquoi ne pas rendre le fichier .txt exécutable au lieu du fichier .sh pour exécuter des scripts?


18

Je me demandais quel était le besoin de mettre des commandes exécutables dans un .shfichier pour créer un seul script, car je peux faire la même chose en mettant les commandes dans un .txtfichier et en le rendant exécutable à l'aide chmod.

Je suppose que cela peut être fait avec n'importe quelle extension de fichier. Donc, je suis assez confus quant à la nécessité d'une .shextension. Toute aide serait très appréciée.


19
Unix ne se soucie pas traditionnellement des extensions de fichier. Vous avez donc raison - cela n'a pas d'importance. C'est purement pour faire comprendre au lecteur que c'est un script shell
vidarlo

8
les extensions de fichiers sous Linux ne sont pas réellement utilisées par le système d'exploitation. Mettre une extension .sh indique simplement à l'utilisateur qu'il s'agit d'un script shell, par opposition à un autre type de fichier, comme un script python ou perl. Personnellement, je ne mets pas d'extensions sur mes scripts.
doneal24

2
Il suffit de vous dire, à vous ou à quiconque le regarde, qu'il s'agit d'un script shell. Si vous ne vous souciez pas de dire quels fichiers .txt sont des scripts à exécuter et quels sont les textes à ouvrir dans un éditeur, n'hésitez pas à tout nommer .txt!
daboross

2
Right.txt, but.txt if.txt everything.txt ends.txt with.txt the.txt .txt.txt suffix.txt, you're.txt not.txt aid.txt yourself.txt (or.txt anybody.txt else .txt) Understanding.txt what.txt each.txt file.txt is.txt there.txt for.txt.
leftaroundabout

1
Ceci est similaire à la question dont il s'agit d'un double supposé, mais cette question ne répond pas réellement à celle-ci.
Kenny Evitt

Réponses:


47

Il n'est pas nécessaire que l'extension de fichier corresponde à quelque chose de spécifique, comme vous l'avez correctement découvert.

Sur les systèmes de type Unix, les types de fichiers sont généralement dérivés du contenu du fichier (c'est-à-dire du "nombre magique" ou d'autres structures caractéristiques dans les premiers octets) et non de leur nom. Vous pouvez également omettre complètement l'extension, ce qui est souvent fait pour les exécutables.

Vérifiez la filecommande, elle vous montre les informations qu'elle peut trouver sur un type de fichier à partir de son contenu.

Pour un script exécutable, le système attend un soi-disant "shebang" dans la première ligne, qui ressemble par exemple à

#!/usr/bin/env python3

et indique le programme à exécuter comme interprète avec le fichier de script comme argument. Si vous exécutez un fichier texte sans un tel shebang, il utilisera votre shell par défaut, c'est-à-dire Bash pour essayer de l'interpréter.

Ainsi, sur les systèmes Unix / Linux, les extensions de nom de fichier sont principalement un indice (mais aucune garantie) permettant à l'utilisateur humain de reconnaître rapidement ce à quoi s'attendre qu'un fichier spécifique contienne. C'est aussi une convention qui peut aider, par exemple, à trouver des fichiers plus rapidement.

Notez cependant qu'il existe certaines exceptions, où le nom et l'extension sont importants (par exemple, certains fichiers de configuration système qui doivent suivre une convention de dénomination, ou de nombreux visualiseurs et éditeurs d'images nécessitent également l'extension pour indiquer le type de fichier).

Vous pouvez également jeter un œil à Les extensions de fichier ont-elles une utilité (pour le système d'exploitation)?


3
Les extensions de fichiers n'ont pas d'importance dans un shell, mais dans un monde d'OS GUI, vous en avez à peu près besoin pour que le double-clic fonctionne correctement.
BallpointBen

@BallpointBen les deux points ne sont pas liés. Même sous une interface graphique, le "type" d'un fichier peut être stocké à côté, en tant que métadonnées, et pourrait déclencher une exécution spécifique, quelle que soit l'extension. MacOS n'a pas d'extensions de noms de fichiers et est une interface graphique et y survit très bien ...
Patrick Mevzek

1
@PatrickMevzek comment les dows MacOS n'ont-ils pas d'extensions? J'ai activé leur affichage et tous les fichiers en ont. Suis-je en train de manquer quelque chose? Je suis nouveau sur la plateforme MacOS
Ciprian Tomoiagă

1
@ CiprianTomoiagă vous pouvez nommer vos fichiers comme vous le souhaitez, le système d'exploitation n'a pas besoin de l'extension pour fonctionner correctement sur eux. Voir par exemple: howtogeek.com/192628/…
Patrick Mevzek

1
@barbecue ciblant le plus petit dénominateur commun ... qu'est-ce qui peut mal tourner avec ça :-) (comme des attaques par le biais de fichiers joints par courrier électronique appelés something.com.txt et faire des astuces pour ignorer le .txt en tant que .com comme signification spécifique dans Windows-land ). En effet, pour les extensions de fichiers d'interopérabilité peut être une bonne pratique. Il faut cependant savoir que c'est clairement un défaut introduit par DOS et que différents OS vivent parfaitement avec des fichiers sans extensions.
Patrick Mevzek

3

Il n'existe pas de fichier "extension" ou "type" dans un nom de fichier UNIX / Linux.

Comme d'autres l'ont souligné, le "type" peut être trouvé en utilisant la commande file en supposant que la magie appropriée est disponible sur votre système. Les noms de fichiers UNIX / Linux peuvent normalement contenir n'importe quel caractère disponible, mais il est souvent utile d'utiliser une certaine forme de convention pour le nom afin que les humains et les machines puissent juger du contenu (et donc de l'utilisation du contenu).

Par exemple, j'utilise souvent une virgule comme premier caractère du nom de fichier pour indiquer un fichier temporaire plutôt que d'utiliser quelque chose comme la chaîne ".tmp" à la fin du nom de fichier. Le résultat est le même, un fichier contenant des données qui ne sont peut-être nécessaires que pour une courte période mais le nom ne nécessite pas d'avoir un "." ni la chaîne "tmp". Cela peut parfois présenter des avantages, par exemple lors de l'analyse d'une liste de noms de fichiers. Mais c'est MA convention et quelqu'un d'autre peut en décider une autre même en utilisant ".tmp" comme convention d'un nom pour un fichier temporaire.

Donc, ma réponse est qu'il n'existe pas d'extension de fichier UNIX / Linux simplement un ensemble de conventions qui ressemblent généralement aux extensions de fichier utilisées dans d'autres systèmes d'exploitation et leurs systèmes de fichiers.


FWIW, j'utilise également une convention non standard pour moi. Mes scripts dont les noms commencent par "."sont censés être pointés par le shell (ils ne peuvent pas s'exécuter de manière significative dans un sous-shell). De même, je désactive la convention par défaut "dot initial = fichier caché" dans mes alias / scripts qui utilisent lspour que je puisse voir tous les fichiers, y compris ceux "cachés". De même sous Windows, je désactive le paramètre "masquer les extensions de fichier".
jrw32982 prend en charge Monica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.