Warum nicht die .txt-Datei anstelle der .sh-Datei ausführbar machen, um Skripte auszuführen?

18

Ich habe mich gefragt, was die Notwendigkeit ist, ausführbare Befehle in eine .shDatei einzufügen, um ein einzelnes Skript zu erstellen, da ich das gleiche tun kann, indem ich die Befehle in eine .txtDatei einfüge und sie mithilfe von ausführbar mache chmod.

Ich gehe davon aus, dass dies mit jeder der Dateierweiterungen durchgeführt werden kann. Ich bin ziemlich verwirrt über die Notwendigkeit einer .shErweiterung. Jede Hilfe wäre sehr dankbar.

Abhik Bhattacharjee
quelle
19
Unix kümmert sich traditionell nicht um Dateierweiterungen. Sie haben also Recht - es spielt keine Rolle.
Nur
8
Dateierweiterungen in Linux werden vom Betriebssystem in keiner wirklichen Weise verwendet. Durch das Einfügen der Erweiterung .sh wird dem Benutzer lediglich mitgeteilt, dass es sich um ein Shell-Skript handelt, im Gegensatz zu einem anderen Dateityp, z. B. einem Python- oder Perl-Skript. Persönlich füge ich meinen Skripten keine Erweiterungen hinzu.
doneal24
2
Es wird nur benötigt, um Ihnen oder anderen Betrachtern mitzuteilen, dass es sich um ein Shell-Skript handelt. Wenn Sie nicht wissen möchten, welche TXT-Dateien auszuführende Skripte sind und welcher Text in einem Editor geöffnet werden soll, können Sie alle TXT-Dateien benennen.
Daboross
2
Right.txt, but.txt if.txt everything.txt ends.txt with.txt the.txt .txt.txt suffix.txt, you.txt not.txt help.txt yourself.txt (or.txt anybody.txt else .txt) Understanding.txt What.txt Each.txt File.txt Is.txt There.txt For.txt.
links um
1
Dies ähnelt der Frage, bei der es sich um ein vermeintliches Duplikat handelt, diese Frage beantwortet dieses jedoch nicht.
Kenny Evitt

Antworten:

47

Wie Sie richtig herausgefunden haben, muss die Dateierweiterung nicht mit bestimmten Elementen übereinstimmen.

Auf Unix-ähnlichen Systemen werden Dateitypen normalerweise vom Inhalt der Datei (dh der "magischen Zahl" oder anderen charakteristischen Strukturen in den ersten Bytes) und nicht von ihrem Namen abgeleitet. Sie können auch die Erweiterung, die häufig für ausführbare Dateien ausgeführt wird, vollständig weglassen.

Überprüfen Sie den fileBefehl, es zeigt Ihnen die Informationen, die es über einen Dateityp aus seinem Inhalt herausfinden kann.

Für ein ausführbares Skript erwartet das System in der ersten Zeile einen sogenannten "shebang", der zB so aussieht

#!/usr/bin/env python3

und gibt an, welches Programm als Interpreter mit der Skriptdatei als Argument ausgeführt werden soll. Wenn Sie eine Textdatei ohne einen solchen Schebang ausführen, wird Ihre Standard-Shell verwendet, dh Bash, um zu versuchen, sie zu interpretieren.

Auf Unix / Linux-Systemen sind Dateinamenerweiterungen daher meistens ein Hinweis (aber keine Garantie) für den menschlichen Benutzer, um schnell zu erkennen, was in einer bestimmten Datei zu erwarten ist. Es ist auch eine Konvention, die z. B. beim schnelleren Auffinden von Dateien helfen kann.

Beachten Sie jedoch, dass es einige Ausnahmen gibt, bei denen der Name und die Erweiterung von Bedeutung sind (z. B. einige Systemkonfigurationsdateien, die einer Namenskonvention folgen müssen, oder viele Bildbetrachter und -editoren benötigen ebenfalls die Erweiterung, um den Dateityp anzugeben).

Sie können auch einen Blick auf Haben Dateierweiterungen einen Zweck (für das Betriebssystem)?

Byte Commander
quelle
3
Dateierweiterungen spielen in einer Shell keine Rolle, aber in einer Welt von GUI-Betriebssystemen benötigen Sie sie so ziemlich, damit Doppelklicks richtig funktionieren.
BallpointBen
@BallpointBen die beiden Punkte haben nichts miteinander zu tun. Auch unter einer GUI kann der "Typ" einer Datei als Metadaten mitgespeichert werden und eine bestimmte Ausführung auslösen, unabhängig davon, welche Erweiterung vorliegt. MacOS hat keine Dateinamenerweiterungen und ist eine GUI und überlebt es sehr gut ...
Patrick Mevzek
1
@PatrickMevzek wie dows MacOS keine Erweiterungen haben? Ich habe es aktiviert, sie anzuzeigen und alle Dateien haben sie. Vermisse ich etwas? Ich bin neu auf der MacOS-Plattform
Ciprian Tomoiagă
1
@ CiprianTomoiagă Sie können Ihre Dateien so benennen, wie Sie möchten, das Betriebssystem benötigt keine Erweiterung, um sie korrekt bearbeiten zu können. Siehe zum Beispiel: howtogeek.com/192628/…
Patrick Mevzek
1
@barbecue auf den kleinsten gemeinsamen Nenner abzielen ... was kann daran falsch sein :-) (wie Angriffe durch angehängte E-Mail-Dateien mit dem Namen something.com.txt und Tricks, um die .txt als .com als spezifische Bedeutung in Windows-Land zu überspringen ). In der Tat können Dateierweiterungen für die Interoperabilität eine gute Praxis sein. Man muss jedoch lernen, dass dies eindeutig ein von DOS im Grunde genommen verursachter Fehler ist und dass verschiedene Betriebssysteme mit Dateien ohne Erweiterungen vollkommen zufrieden sind.
Patrick Mevzek
3

Es gibt keine Dateierweiterung oder Dateityp in einem UNIX / Linux-Dateinamen.

Wie bereits erwähnt, kann der "Typ" mit dem Befehl file ermittelt werden, sofern die entsprechende Magie auf Ihrem System verfügbar ist. UNIX / Linux-Dateinamen können normalerweise alle verfügbaren Zeichen enthalten. Oft ist es jedoch hilfreich, eine Art Konvention für den Namen zu verwenden, damit sowohl Menschen als auch Maschinen über den Inhalt (und damit über die Verwendung des Inhalts) urteilen können.

Als Beispiel verwende ich oft ein Komma als erstes Zeichen des Dateinamens, um eine temporäre Datei anzugeben, anstatt so etwas wie die Zeichenfolge ".tmp" am Ende des Dateinamens zu verwenden. Das Ergebnis ist dasselbe: Eine Datei mit Daten, die möglicherweise nur für kurze Zeit erforderlich sind, für den Namen jedoch kein "." darin noch die Zeichenfolge "tmp". Dies kann manchmal Vorteile haben, z. B. beim Analysieren einer Liste von Dateinamen. Aber es ist MEINE Konvention und jemand anderes kann sich für eine andere Konvention entscheiden, die sogar ".tmp" als Namenskonvention für eine temporäre Datei verwendet.

Meine Antwort an Sie lautet also, dass es keine UNIX / Linux-Dateierweiterung gibt, sondern nur eine Reihe von Konventionen, die normalerweise wie die Dateierweiterungen aussehen, die in anderen Betriebssystemen und deren Dateisystemen verwendet werden.

PJF
quelle
FWIW, ich verwende auch eine Nicht-Standard-Konvention für mich. Meine Skripte, deren Namen mit "" beginnen ".", sollen durch die Shell punktiert werden (sie können in einer Subshell nicht sinnvoll ausgeführt werden). Dementsprechend deaktiviere ich die Standardkonvention "initial dot = hidden file" in meinen Aliasen / Skripten, die verwendet lswerden, damit ich alle Dateien sehen kann, einschließlich der "versteckten". Ebenso deaktiviere ich unter Windows die Einstellung "Dateierweiterungen ausblenden".
jrw32982 unterstützt Monica