2012-12-14 29 views
68

Im Bash-Skript, was bedeutet #!/bin/bash in der 1. Zeile?Bash Script: Was bedeutet #!/Bin/bash?

UPDATE: Gibt es einen Unterschied zwischen #!/bin/bash und #!/bin/sh?

+2

@anishsane dein Kommentar hat mich inspiriert, diese verschwindende Datei zu schreiben echo -e '#!/Bin/rm \ nGoodbye!' > verschwinden && chmod 700 verschwinden && ./vanish && cat verschwinden –

Antwort

83

Das nennt man shebang, es sagt der Shell, mit welchem ​​Programm das Skript zu interpretieren ist, wenn es ausgeführt wird.

In Ihrem Beispiel soll das Skript von der Shell bash interpretiert und ausgeführt werden.

Einige andere Beispiel Bauden sind:

(aus Wikipedia)

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell 
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell 
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks 
#!/usr/bin/php — Execute the file using the PHP command line interpreter 
#!/usr/bin/python -O — Execute using Python with optimizations to code 
#!/usr/bin/ruby — Execute using Ruby 

und ein paar zusätzliche, die ich aus der Spitze von meinem Kopf denken kann, wie zum Beispiel:

#!/bin/ksh 
#!/bin/awk 
#!/bin/expect 

In einem Skript mit dem Bash Shebang zum Beispiel würden Sie Ihren Code mit Bash-Syntax schreiben; während in einem Skript mit expect shebang, würden Sie es in Expect-Syntax codieren, und so weiter.

Antwort auf aktualisierten Teil:

Es hängt davon ab, was /bin/sh Punkte tatsächlich auf Ihrem System. Oft ist es nur ein symbolischer Link zu /bin/bash. Manchmal sind portable Skripte mit #!/bin/sh geschrieben, um anzuzeigen, dass es sich um einen Shell-Skript, aber es nutzt je nachdem, welche Shell durch /bin/sh auf dem jeweiligen System bezeichnet wird (vielleicht zeigt er auf /bin/bash, /bin/ksh oder /bin/zsh)

+0

Danke! Aber gibt es einen Unterschied zwischen '#!/Bin/bash' und' #!/Bin/sh'? – Raptor

+1

@ShivanRaptor '#!/Bin/bash' Bedeutet, dass dieses Skript in bash ausgeführt wird. '#!/bin/sh' bedeutet, dass dieses Skript in' sh' ausgeführt wird. Dies ist die Standard-Unix-Shell, die bash oder eine andere Variante wie ksh, dash, zsh usw. sein kann. –

+0

Wenn 'bash' als' sh' ausgeführt wird , es verhält sich anders (mehr POSIX-like) als wenn es als 'bash' ausgeführt wird. Lesen Sie das Handbuch. es deckt dieses Detail ab. –

10

Wenn die ersten Zeichen in Ein Skript ist #!, das heißt shebang. Wenn Ihre Datei mit #!/path/to/something startet, ist der Standard something auszuführen und der Rest der Datei an dieses Programm als Eingabe zu übergeben.

das gesagt ist, den Unterschied zwischen #!/bin/bash, #!/bin/sh oder sogar #!/bin/zsh ist, ob die bash, sh oder zsh Programme verwendet werden, um den Rest der Datei zu interpretieren. bash und sh sind nur verschiedene Programme, traditionell. Auf einigen Linux-Systemen sind es zwei Kopien desselben Programms. Auf anderen Linux-Systemen ist sh eine Verbindung zu dash, und auf traditionellen Unix-Systemen (Solaris, Irix, usw.) bash ist normalerweise ein völlig anderes Programm als sh.

Natürlich muss der Rest der Zeile nicht in SH enden. Es könnte auch #!/usr/bin/python, #!/usr/bin/perl oder sogar #!/usr/local/bin/my_own_scripting_language sein.

+0

'sh' ist normalerweise' bash', das einen Kompatibilitätsmodus ausführt, dies ist wahr geworden, da bash die Standard-Shell für die meisten Linux-Distributionen wurde und IIRC für einige Jahre davor, sicher, dass es 15 Jahre ist, möglicherweise mehr als 20. – ocodo

+0

Auf meinem Debian- und Ubuntu-System ist '/ bin/sh' Strich. Android sagt, es benutzt 'Asche' als'/bin/sh'. –

+1

@JoshuaDBoyd Netter Haken, viele (obwohl wahrscheinlich nicht alle) BSD-Unixes verwenden Ash, als ihre Standard-Shell, im Gegensatz zu Bash, und Debian/Ubuntu verwenden Dash. Ähnlich wie bei Bash haben Ash & Dash "sh" Kompatibilitätsmodi. Wenn wir uns mit Solaris beschäftigen, haben Aix, HPUX, Ultrix, SCO usw. jeweils eine eigene Standard-Shell, die eine SH-Emulation hat (um POSIX-konform zu bleiben). – ocodo

12

Im Bash-Skript, was bedeutet #!/Bin/bash in der 1. Zeile?

Im Linux-System haben wir Shell, die unsere UNIX-Befehle interpretiert. Jetzt gibt es eine Reihe von Shell im Unix-System. Unter ihnen gibt es eine Shell namens bash, das ist sehr sehr verbreitet Linux und es hat eine lange Geschichte. Dies ist eine Standard-Shell in Linux.

Wenn Sie ein Skript schreiben (Sammlung von Unix-Befehlen usw.), können Sie angeben, welche Shell es verwenden kann. Im Allgemeinen können Sie angeben, welche Shell es wäre, indem Sie Shebang verwenden (Ja, das ist, wie es heißt).

Also, wenn Sie #!/Bin/bash oben in Ihren Skripten, dann sagen Sie Ihrem System, bash als Standard-Shell zu verwenden.

Nun zu Ihrer zweiten Frage: Gibt es einen Unterschied zwischen #!/Bin/bash und #!/Bin/sh?

Die Antwort ist ja. Wenn Sie #!/Bin/bash sagen, dann sagen Sie Ihrer Umgebung/os, bash als Befehlsinterpreter zu verwenden. Das ist hart codierte Sache.

Jedes System hat eine eigene Shell, die das System zur Ausführung seiner eigenen Systemskripte verwendet. Diese System-Shell kann von Betriebssystem zu Betriebssystem variieren (die meiste Zeit wird es Bash sein. Ubuntu verwendet vor kurzem dash als Standard-System-Shell). Wenn Sie #!/Bin/sh angeben, verwendet das System seine interne System-Shell, um Ihre Shell-Skripte zu interpretieren.

Besuchen Sie diese link für weitere Informationen, wo ich dieses Thema erläutert habe.

Hoffe, dies wird Ihre Verwirrungen beseitigen ... viel Glück.