GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es richtig, /bin/sh im Hashbang zu verwenden, wenn die Bourne-Shell in einer Distribution nicht verfügbar ist?

Im Allgemeinen enthalten Shell-Skripte den folgenden Kommentar in der ersten Zeile der Skriptdatei:#!/bin/sh . Nach den von mir durchgeführten Recherchen wird dies „Hash Bang“ genannt und ist ein herkömmlicher Kommentar. Dieser Kommentar teilt Unix mit, dass diese Datei von der Bourne Shell unter dem Verzeichnis /bin ausgeführt wird .

An diesem Punkt setzt meine Frage an. Bisher habe ich diesen Kommentar wie #!/bin/bash nicht gesehen . Es ist immer #!/bin/sh . Ubuntu-Distributionen verfügen jedoch nicht über das Bourne-Shell-Programm. Sie haben die Bourne Again Shell (bash).

Ist es an dieser Stelle richtig, den Kommentar #!/bin/sh zu platzieren in Shell-Skripten, die in Ubuntu-Distributionen geschrieben wurden?

Akzeptierte Antwort:

#!/bin/sh sollte auf allen Unix- und Unix-ähnlichen Distributionen funktionieren. Es wird allgemein als der portabelste Hashbang angesehen, solange Ihr Skript POSIX-konform bleibt. Der /bin/sh Shell soll eine Shell sein, die den POSIX-Shell-Standard implementiert, unabhängig davon, was die eigentliche Shell ist, die sich als /bin/sh tarnt Schale.

#!/bin/sh ist jetzt normalerweise nur noch ein Link, da die Bourne-Shell nicht mehr gepflegt wird. Auf vielen Unix-Systemen /bin/sh wird ein Link zu /bin/ksh sein oder /bin/ash , auf vielen RHEL-basierten Linux-Systemen wird es ein Link zu /bin/bash sein , auf Ubuntu und vielen Debian-basierten Systemen ist es jedoch ein Link zu /bin/dash . Alle Shells, wenn sie als sh aufgerufen werden , wechselt in den POSIX-Kompatibilitätsmodus.

Der Hashbang ist jedoch ein wichtiger Platzhalter, da er eine viel größere Portabilität als andere Methoden ermöglicht, solange Ihr Skript streng POSIX-konform ist (wiederholt, um die Wichtigkeit zu betonen).

Hinweis:Wenn bash im POSIX-Modus aufgerufen wird, wird es immer noch einige Nicht-POSIX-Dinge wie [[ , Arrays und mehr. Diese Dinge können auf einer Nicht-bash fehlschlagen System.


Linux
  1. Was ist die Verwendung des Befehls ‘/usr/bin/[‘ [eckige Klammer] in Linux?

  2. Warum ist es besser, „#!/usr/bin/env Name“ statt „#!/path/to/name“ als Shebang zu verwenden?

  3. /usr/bin vs. /usr/local/bin Unter Linux?

  4. Gibt es einen Grund, einen Shebang zu haben, der auf /bin/sh statt auf /bin/bash zeigt?

  5. Linux – Zusammenführen von /usr/bin und /usr/sbin in /bin (gnu/linux)?

cmake --version zeigt auf /usr/bin/cmake, während cmake auf /usr/local/bin zeigt

Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

Was bedeuten /usr/sbin, /usr/local/sbin und /usr/local/bin?

Wann muss ich #!/bin/bash und wann #!/bin/sh verwenden?

/bin Inhalt nach /usr/bin verschoben, rückgängig machen möglich?

#!/bin/sh vs. #!/bin/bash für maximale Portabilität