Sie werden oft auf Shell-Skripte stoßen, die mit:
beginnen#!/bin/bash
Diese #!
wird Shebang oder Hashbang genannt. Der Shebang spielt eine wichtige Rolle beim Shell-Skripting, insbesondere beim Umgang mit verschiedenen Shell-Typen.
In diesem Tutorial lernen Sie:
- Was ist Shebang?
- Inwiefern spielt es eine wichtige Rolle beim Shell-Scripting?
Was ist Shebang in Shell-Scripting?
Der Shebang ist die Kombination aus # (Raute-Taste) und ! (Ausrufezeichen). Diese Zeichenkombination hat eine besondere Bedeutung, wenn sie in der allerersten Zeile des Skripts verwendet wird. Es wird verwendet, um den Interpreter anzugeben, mit dem das angegebene Skript standardmäßig ausgeführt wird.
Also, wenn die erste Zeile eines Skripts ist:
#!/bin/bash
Dies bedeutet, dass der Interpreter eine Bash-Shell sein sollte. Wenn die erste Zeile lautet:
#!/bin/zsh
Das bedeutet, dass der zu verwendende Interpreter die Z-Shell ist.
Das #! ist sicherlich etwas Besonderes, weil # für Kommentare in Shell-Skripten verwendet wird, aber hier hat es eine besondere Bedeutung.
Warum der Shebang beim Shell-Scripting wichtig ist?
Hier ist das Ding. Der Shebang, gefolgt von der ausführbaren Datei der Shell, ist für ein Skript nicht obligatorisch.
Wenn Sie ein einfaches Skript wie dieses schreiben:
echo "Namaste, folks!"
Und geben Sie ihm die Ausführungsberechtigung und führen Sie es mit der . Operator, es wird von Ihrer Login-Shell ausgeführt.
[email protected]:~$ cat sample
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample
[email protected]:~$ ./sample
Namaste, folks!
Warum enthalten Shell-Skripte dann die Zeile #!/bin/bash am Anfang des Skripts?
Denn für Linux- und UNIX-Systeme stehen mehrere Shells zur Verfügung. Während diese Shells größtenteils eine gemeinsame Syntax haben, haben sie eine andere Syntax oder eine andere Art, Dinge zu handhaben.
Aus diesem Grund ist es wichtig, den richtigen Shell-Interpreter im Skript anzugeben, da sonst einige Skripte möglicherweise unterschiedliche Ergebnisse liefern, wenn sie in verschiedenen Shells ausgeführt werden.
Lassen Sie mich Ihnen das an einem einfachen Beispiel zeigen.
Wichtigkeit der Angabe des Shell-Interpreters mit shebang
Ich habe ein Beispiel-Shell-Skript mit einer Reihe von Distributionen geschrieben. Das Skript zeigt dann die Distribution bei Index 2 an.
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Ich habe die Shebang-Zeile nicht hinzugefügt, um einen Shell-Interpreter anzugeben. Das bedeutet, wenn ich dieses Skript ausführe, wird es von der Standard-Shell (in meinem Fall bash) ausgeführt:
[email protected]:~$ echo $0
bash
Können Sie die Ausgabe des Skripts erraten?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: SUSE
Es zeigt SUSE bei Index 2, da der Array-Index in Bash und vielen anderen Programmier- und Skriptsprachen bei 0 beginnt. ABER das ist in der Z-Shell nicht der Fall. In der Z-Shell beginnt der Array-Index bei 1.
Ich habe die Z-Shell auf meinem System installiert. Ich ändere das Skript und füge die Shebang-Zeile hinzu, um anzugeben, dass das Skript standardmäßig von der Z-Shell ausgeführt werden soll.
#!/bin/zsh
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Können Sie die Ausgabe erraten, wenn ich das Skript jetzt ausführe?
[email protected]:~$ ./arrays.sh
Distro at index 2 is: Fedora
Merkst du jetzt den Unterschied? Es ist das gleiche Skript, aber das Hinzufügen der Shebang-Zeile machte den Unterschied.
Aus diesem Grund ist es wichtig, den richtigen Shell-Interpreter mit dem Shebang-Operator anzugeben. Als Systemadministrator schreiben Sie möglicherweise Shell-Skripte, die eine bestimmte Shell berücksichtigen, sei es bash, ksh oder zsh. Sie können jedoch nicht sicher sein, dass das System, auf dem das Skript ausgeführt wird, dieselbe Standard-Shell wie Ihres hat. Jetzt ergeben die Dinge einen Sinn, oder?
Shebang wird ignoriert, wenn du Shell explizit angibst
Warum betone ich die "Standard"-Shell? Weil der Shebang den Interpreter angibt, mit dem das Skript ausgeführt werden soll.
Sie können die Shell jedoch explizit angeben, und in solchen Fällen wird die Shebang-Zeile ignoriert.
Wie genau funktioniert der Shebang?
Wenn Sie den Shebang in der ersten Zeile eines Skripts verwenden, sagen Sie der Shell, dass sie das angegebene Skript mit dem angegebenen Befehl ausführen soll.
Grundsätzlich #!/bin/zsh
entspricht:
/bin/zsh script_name
Ich habe Ihnen gesagt, wenn die erste Zeile eines Skripts mit shebang beginnt, bedeutet dies, dass Sie den Shell-Interpreter angeben.
Das stimmt nur teilweise. Eigentlich ist das der Zweck des Shebang-Charakters. Aber es ist nicht notwendig, dass die Shebang-Zeile eine ausführbare Shell haben muss. Es kann alles sein.
Zum Beispiel werde ich #!/bin/zsh
ersetzen mit #!/bin/cat
. /bin/cat ist die ausführbare Datei des cat-Befehls.
#!/bin/cat
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
Das bedeutet, dass dieses Skript jetzt mit cat
ausgeführt wird Befehl und den Inhalt des Skripts anzeigen.
Es funktioniert, solange es auf einen ausführbaren Befehl zeigt. Wenn Sie zufällige Dinge einfügen, wird ein Fehler ausgegeben.
Ich ändere die Shebang-Zeile zu:
#!/home/abhishek
Es zeigt eindeutig nicht auf die ausführbare Datei eines Befehls und wirft daher einen schlechten Interpreterfehler aus.
[email protected]:~$ cat arrays.sh
#!/home/abhishek
distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied
Schlussfolgerung
Lassen Sie mich noch ein paar Fragen beantworten, bevor Sie diesen Artikel beenden:
- Es ist wichtig, dass zwischen
#
kein Leerzeichen steht und!
. Sie können es NICHT so verwenden:# !/bin/bash
. - Die meisten Systeme erlauben Leerzeichen zwischen
#!
und/bin/bash
Es empfiehlt sich jedoch, Leerzeichen zwischen#!
zu vermeiden und/bin/bash
. #!
muss in der ersten Zeile stehen, sonst wird die Shebang-Zeile als Kommentar behandelt. Sie dürfen nicht einmal eine Leerzeile davor haben.
Ich hoffe, Sie verstehen besser, warum #! wird am Anfang von Shell-Skripten in Linux verwendet. Fühlen Sie sich frei, einen Kommentar zu hinterlassen, wenn Sie Fragen oder Vorschläge haben.