Wenn ich .sh
Dateien in Terminal ausführen möchte , muss ich sie voranstellen sh
.
Gibt es eine Möglichkeit, dies zu vermeiden und so das Tippen zu sparen?
Wenn ich .sh
Dateien in Terminal ausführen möchte , muss ich sie voranstellen sh
.
Gibt es eine Möglichkeit, dies zu vermeiden und so das Tippen zu sparen?
Antworten:
Wenn Sie Ihr Skript über die Shell ausführen, benötigen Sie das #!/bin/sh
in dieser Antwort beschriebene " shebang" nicht. Jedes von mir verwendete Unix-ähnliche System, einschließlich OS X, wird standardmäßig verwendet, /bin/sh
wenn kein spezifischer Interpreter angegeben ist ( obwohl es eine gute Idee ist, da Nicht-Shells nicht wissen, wie sie Ihr Skript ausführen sollen, wenn Sie nicht den Shebang geben.)
Sie brauchen auch keine .sh
Erweiterung. Sie tun müssen ausführbare Berechtigungen festlegen, zB
$ chmod +x script.sh
( $
Dies ist die Shell-Eingabeaufforderung. Ich verwende sie, um Befehle zu veranschaulichen, die Sie der interaktiven Shell geben. Geben Sie sie nicht ein!)
Ich glaube jedoch, Sie sind verwirrt, dass Sie ein Skript erstellt haben, z. B. script.sh
im aktuellen Verzeichnis, und versuchen, es durch einfaches Eingeben auszuführen script.sh
. z.B
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
Mittel control- D. Sie werden diese Notation in vielen writeups zu finden unter Unix verwenden.)
Die Tatsache, dass es sich script.sh
in diesem Fall um ein Shell-Skript handelt, ist nur das halbe Problem. Ihr eigentliches Problem ist, dass die Shell standardmäßig nicht das aktuelle Verzeichnis nach einem Programm durchsucht. Dies funktioniert jedoch:
$ sh script.sh
hello, world
weil sh
das Skript als Argument nimmt.
Sie können ein Skript - oder auch eine beliebige ausführbare Datei - im aktuellen Verzeichnis ausführen , wenn es als ausführbar markiert ist (z. B. chmod +x
), indem Sie angeben, dass Sie das Skript im aktuellen Verzeichnis ausführen möchten:
$ ./script.sh
hello, world
Sie können das Skript auch in ein Verzeichnis auf Ihrer Website verschieben PATH
. Ich empfehle /usr/local/bin
dies, wenn Ihr Skript systemweit verwendet werden soll, oder ein bin
Verzeichnis in Ihrem Zuhause, wenn das Skript nur für Sie bestimmt ist. Letzteres erfordert, dass Sie die folgenden Zeilen zu Ihrem Ausgangsverzeichnis hinzufügen $HOME/bin
, die sich in Ihrem neuen bin-Verzeichnis befinden:PATH
.profile
PATH=$HOME/bin:$PATH
export PATH
Schließlich können Sie, wenn Sie möchten, das aktuelle Verzeichnis zu Ihrem hinzufügen PATH
, wodurch Sie einfach zu einem Verzeichnis script.sh
wechseln können, das - oder eine andere ausführbare Datei - enthält, und es eingeben können
$ script.sh
um es auszuführen. Doch ich diese Praxis nicht empfehlen , da ein Angreifer nun Sie in Laufen eine beliebige ausführbare Datei durch Fallenlassen ein ausführbares Skript (namens, sagen wir, Trick kann ls
) in ein Verzeichnis wird in Ihnen. Wenn Sie wirklich es tun wollen, obwohl, Fügen Sie einfach Folgendes hinzu .profile
:
PATH=.:$PATH
export PATH
sl
oder lls
oder l
... dh Tippfehler. Lass einfach .
aus $PATH
. Außerdem können (oder sollten) Sie möglicherweise nicht jedem auf Ihrem System vertrauen. Angenommen, es gibt einige Exploit, der es einem Angreifer ermöglicht , eine beliebige Datei in ein Verzeichnis zu löschen, aber sie müssen Sie die Datei auszuführen , um zu einem besseren eskalieren ausnutzen (zB, Daten sammeln und nach Hause telefonieren). Verteidigung in der Tiefe!
/tmp
einem anderen von der Welt beschreibbaren Verzeichnis belassen könnte.
/tmp
et al. Komm mit dem Territorium.
Sie müssen nicht aufrufen, sh
wenn die Skriptdatei als ausführbar markiert ist. In diesem Fall können Sie meinen Namen so nennen, wie Sie es mit jedem anderen Befehl aus der vorhandenen Shell tun würden.
Um richtig zu sein, müssen Sie zwei Dinge tun:
Bearbeiten Sie Ihr Skript so, dass oben in Ihrem Skript eine shebang- Direktive steht:
#!/bin/sh
... Das würde der Shell mitteilen, welcher Interpreter zum Ausführen des Skripts verwendet werden soll. in diesem Fall die /bin/sh
ausführbare Datei.
Markieren Sie das Skript mit dem Befehl chmod als von Ihnen ausführbar :
chmod u+x scriptname.sh
Sobald Sie beides getan haben, sollten Sie in der Lage sein, Ihr Skript auszuführen, indem Sie den Dateinamen Ihres Skripts in die Befehlszeile eingeben. Sie müssen sich im selben Verzeichnis wie Ihr Skript befinden, es sei denn, Sie führen den hinzugefügten Schritt des Hinzufügens des enthaltenen Ordners zu Ihrer PATH-Variablen aus . Wenn es Ihnen egal ist, auf welcher Shell das Skript ausgeführt wird, müssen Sie den ersten Schritt nicht angeben. sh
Oft ist es jedoch besser, genau zu sein und "shebangsh" festzulegen.
/bin/sh
, obwohl sie nicht weh tun.
ksh
meiner Zeit viele Skripte auf HP-UX geschrieben habe - aber es ist gut zu wissen, dass dies nicht unbedingt erforderlich ist.
exec
Syscall verwenden, erhalten Sie ENOEXEC
(Exec-Format-Fehler) ). Entschuldigung, @bmike, @ ChrisW.Rea. Ich werde jetzt meine Antwort bearbeiten.