Warum wird auf einigen Systemen eine .sh
Datei nur durch Angabe des Dateinamens ohne Erweiterung ausgeführt, und für andere wird Name plus Erweiterung benötigt? In meinem Fall versuche ich, eine Reihe von Befehlen zu schreiben, die diesen Anweisungen folgen .
Ich gebe jetzt die Erweiterung an, aber es .sh
wäre besser, wenn ich die Befehle ohne ausführen könnte.
command-line
scripts
Philip Kirkbride
quelle
quelle
.sh
als Erweiterung wird unter vielen Umständen als schlechte Praxis angesehen: Es ist im Gegensatz zu den Namen anderer Befehle (die Sie nicht ausführenls.elf
) oft irreführend (wenn Siefoo.sh
mit beginnen#!/bin/bash
,sh foo.sh
wird sie beim Ausführen mit einem anderen Interpreter ausgeführt, als für den sie erstellt wurde ), und wenn Sie neu schreibenfoo.sh
, um ein Python-Programm zu sein, müssen Sie bei der Verwendung dieser Erweiterung zwischen der Beibehaltung des jetzt irreführenden Namens und dem erneuten Schreiben jedes Programms wählen, das ihn aufruft.+x
set - wofoo.sh
eine Bibliothek ist , die in jede POSIX - Shell gezogen werden kann,foo.bash
kann in bash, bezogen werdenfoo.ksh
in ksh etc.Antworten:
Du bist verwirrt. Die
.sh
Erweiterung ist nur ein Hinweis für den Menschen und hat keinerlei Einfluss darauf, wie das System mit der Datei umgeht. Unix / Linux hat den Windows-Secrets.pdf.exe
Fehler nicht verursacht.Folgendes passiert beim Tippen
foo
:Umleitung für
STDIN
,STDOUT
undSTDERR
eingerichtet sind.Die Shell überprüft ihre interne Hash-Tabelle, um festzustellen, ob sie bereits einen
$PATH
Eintrag für kenntfoo
. Ist dies nicht der Fall, durchsucht die Shell die Verzeichnisse$PATH
nach einer Dateifoo
, deren Dateiberechtigungen das Ausführungsbit enthalten. Ersterfoo
gewinnt.Wenn die ersten beiden Bytes der Datei vorhanden
foo
sind#!
, ist die nächste Zeichenfolge der Name eines auszuführenden Interpreters. Führt also#!/bin/bash
ein Bash-Skript,#!/usr/bin/perl
ein Perl-Skript usw. ein.Wenn die Datei mit beginnt
\177ELF
, ist sie eine ausführbare Binärdatei undld.so
startet sie.Lesen Sie
man execve
undman ld.so
für eine detailliertere Erklärung.quelle
chmod +x
) dies so ziemlich löst, oder?x
Bit auf alles) und woher die Datei stammt (jeder Prozess mit Kontrolle über das Verzeichnis könnte dazu verleitet werden, die Berechtigungen festzulegen). . Also, es mildert es, aber ich würde nicht sagen, dass es es löst .Secrets.pdf.exe
hide file extension
Der entscheidende Punkt ist: Erweiterungen sind in jedem Unix-ähnlichen Systemsystem irrelevant. Ein Dateiname ist nur ein Name und hat keine Auswirkung darauf, ob ein Skript oder eine kompilierte ausführbare Datei ausgeführt werden kann . Ein Programmierer kann eine
.sh
Erweiterung hinzufügen ,.py
um anzugeben, dass es sich bei einer Datei um ein Shell-Skript oder um ein Python-Skript handelt. Im Gegensatz zu Windows kümmert sich ein Unix nicht um die Benennung, sondern um Berechtigungen.Was zählt, ist die ausführbare Berechtigung, die einer Datei erteilt wird. Was Sie mit überprüfen können
Ausführen von ausführbaren Dateien
Es gibt im Allgemeinen mehrere Möglichkeiten, ein Skript auszuführen.
./my_script_name
. Das.
bedeutet aktuelles Verzeichnis./home/user/bin/my_script_name
(Die beiden oben genannten Methoden setzen voraus, dass die ausführbare Berechtigung festgelegt ist. Ob die Datei Teil der
$PATH
Variablen ist oder nicht , spielt keine Rolle. Das Vorhandensein der#!
Zeile ist ebenfalls wichtig. Ohne diese Option wird das Skript von der aktuellen Shell ausgeführt, die Sie geöffnet haben. Wenn ich eincsh
Skript habe ohne diese Zeile, und versuchen Sie, es in bash mit auszuführen./my_script.csh
, wird es fehlschlagen)$PATH
Variablen ist, können Sie es einfach durch Aufrufen des Namens ausführen. Sie können denchmod
Befehl in der Befehlszeile aufrufen, indem Sie einfach seinen Namen eingeben, da er sich in einem/bin
Ordner befindet./bin
ist immer Teil der$PATH
Variablen. In diesem Fall spielen ausführbare Berechtigungen und der Speicherort des Skripts eine Rolle. filename.sh
odersource filename.sh
bewirkt, dass das Skript so behandelt wird, als wäre es eine Tastatureingabe, dh als wäre es direkt in die Befehlszeile eingegeben worden. In diesem Fall spielen ausführbare Berechtigungen und der Speicherort keine RolleBeispiele
Beispiel # 1, ausgeführt mit einem Interpreter, um Berechtigungen auszuführen
Beispiel # 2, ausgeführt mit
./
ausführbarem Berechtigungssatz, Shebang Line Set.Beispiel # 3, läuft ohne Shebang-Line-Set
Beispiel 4: Ausführen eines Skripts mit festgelegten ausführbaren Berechtigungen für einen Ordner, der Teil einer
$PATH
Variablen istBeispiel 5, Erweiterung entfernen, wird weiterhin ausgeführt, da Erweiterungen keine Rolle spielen, aber Berechtigungen haben und Teil von
$PATH
:quelle
PATH
?man chmod
, wie Sie Berechtigungen festlegenGute Erklärungen hier schon. Ich wollte nur hinzufügen, dass Sie im Idealfall keine Dateierweiterungen für ausführbare Dateien verwenden sollten.
Normalerweise müssen Sie etwas relativ Leichtes tun und mit einem kleinen Shell-Skript beginnen. Mit der Zeit fügen Sie Ihrem Skript immer mehr Funktionen hinzu, bis es mit der Zeit nicht mehr zu warten ist oder Sie Funktionen benötigen, die Sie mit einem Shell-Skript nicht einfach erreichen können, und überlegen, dieses Shell-Skript in einer anderen Sprache (Python) umzuschreiben , perl, ...?).
Das Umschreiben von Grund auf wird in der Regel als Fehler angesehen, bei Skripten kann dies jedoch sinnvoll sein, da sie normalerweise nicht so umfangreich sind oder über zahlreiche Funktionen verfügen. Nehmen wir jedoch an, dass es möglich ist, in einer anderen Sprache von Grund auf neu zu schreiben und dabei die Funktionen und Parameter / Flags des ursprünglichen Shell-Skripts beizubehalten.
Benutzer dieses Skripts müssen sich dieser Sprachänderung nicht bewusst sein. Sie führen denselben Befehl weiter aus und arbeiten weiter.
Wenn Ihr Skript benannt wurde
do-something.sh
, kann es weiter existierendo-something.sh
, aber jetzt ist es (zum Beispiel) in Python geschrieben, und daher ist Ihr erster Hinweis jetzt ein völlig irreführender.quelle
Um Dateien ohne Dateierweiterung auszuführen, die Sie normalerweise nicht viel tun müssen, stellen Sie einfach sicher, dass Sie (im Fall von Bash-Skripten) die richtige Shebang-Zeile in der ersten Zeile haben:
dann müssen Sie auch die Datei für das System ausführbar machen durch
Dies ist das gleiche wie bei
chmod +x yourfilename
der Verwendung der Zahlen, die einfach erklärt werden.Es ist ein Zahlentripel aus hinzugefügten Oktalen, die erste Zahl steht für den Benutzer, die zweite für die Gruppe und die dritte für andere, mehr dazu finden Sie hier .
Und wenn Sie sich im selben Verzeichnis wie Ihr Skript befinden, vergessen Sie nicht,
./
wie folgt zu verwenden :quelle
Das .sh-Suffix kann tatsächlich stören, da Sie zum Ausführen myscript.sh eingeben müssen, anstatt nur myscript, das nicht funktioniert. Nennen Sie es lieber "myscript" ohne das Suffix .sh, und eine schnelle Verwendung des Befehls "file" zeigt Ihnen, ob es sich um eine ausführbare Binärdatei (ELF-Format unter Linux), ein Shell-Skript oder eine andere Art von Skript handelt.
QDOS (schnelles und schmutziges Betriebssystem, später von IBM in "DOS" umbenannt, nachdem es von mirosoft raubkopiert und illegal an sie verkauft wurde) und andere billige Abzocke von CP / M, einschließlich Windows, vermischen all dies, da es auf diesen Systemen keine gibt So etwas wie Ausführungsberechtigungen für Dateien. Dies hat in den letzten 30-40 Jahren zu unzähligen Sicherheitslücken geführt. Tatsächlich habe ich vor ein paar Minuten gerade mehrere Junk-Mails mit einer in Tölpel eingeschlossenen Zip-Datei erhalten, die in MYPICTURE.JPG.zip umbenannt wurde :)
quelle