Ich weiß, dass ich beide als erste Zeile von Skripten verwenden kann, um die gewünschte Shell aufzurufen.
Wäre #!/bin/sh
zu empfehlen, wenn Kompatibilität mit allen Unix-Systemen unabdingbar ist?
In meinem Fall interessieren mich nur Ubuntu (Debian) und OSX. Könnte ich #!/bin/bash
davon ausgehen, dass es auf beiden Systemen funktioniert?
Würde dies auch die Verwendung von Skripten mit einer moderneren und klareren Syntax für Befehle erleichtern? Bezieht sich using #!/bin/sh
auch auf POSIX?
/bin
und/usr/bin
. Aus diesem Grund ist es#!/usr/bin/env <shname>
heutzutage wahrscheinlich besser, es für die Portabilität zu verwenden .Antworten:
Wenn Sie für den Anfang davon ausgehen können, dass Bash vorinstalliert ist (was meines Wissens auf allen von Ihnen aufgelisteten Systemen der Fall ist), verwenden Sie den folgenden Hashbang, um kompatibel zu sein:
Dies ruft alles auf, was
bash
gerade konfiguriert wird, egal ob es sich in/bin
oder befindet/usr/local/bin
.Auf den meisten Systemen eines breiten Spektrums (einschließlich AIX, Solaris und verschiedenen BSD-Versionen)
bash
landeten sie an verschiedenen Standorten, jedochenv
immer in/usr/bin/env
. Der Trick liegt jedoch nicht bei mir, sondern beim Autor des Bash Cookbook.Wie auch immer, mit Bash können Sie einige "moderne" Funktionen verwenden, die Ihnen das Leben erleichtern.
Zum Beispiel die doppelten Klammern:
In traditionellen Shell-Dialekten müsste man auf Folgendes zurückgreifen:
Das Beste an den doppelten Klammern ist jedoch, dass sie reguläre Ausdrücke für den Abgleich zulassen. Das Bash Hackers Wiki gibt Ihnen viele Tricks in diese Richtung.
Sie können auch ganz bequeme Ausdrücke wie
$((2**10))
oder andere arithmetische Ausdrücke verwenden, die der$((expression))
Syntax entsprechen.Die Verwendung von Backticks für Subshells ist in Ordnung, wenn auch etwas veraltet. Die Verschachtelungsfunktionen von
$(command ...)
Aufrufen sind jedoch viel praktischer, da Sie nicht viele Dinge auf verschiedenen Subshell-Ebenen umgehen müssen.Dies sind nur ein paar Dinge, die Bash Ihnen gegenüber der herkömmlichen POSIX-
sh
Syntax bietet .Aber wenn Sie mehr Leistung auf der Shell wollen (nicht nur in Skripten), schauen Sie sich auch an
zsh
.quelle
sh
solche Aufgaben.sh
Verknüpfung zubash
wird die Sicherheitsanfälligkeit nicht durch die Verwendung von verringertsh
.In Debian und Ubuntu
/bin/sh
istdash
dies eine POSIX-kompatible Shell. Wenn Sie dies angeben#!/bin/sh
, müssen Sie sich in Ihrem Skript auf POSIX-Anweisungen beschränken. (Der Vorteil ist, dass derdash
Start schneller erfolgt alsbash
, sodass Ihr Skript seine Arbeit in kürzerer Zeit erledigen kann.)Auf vielen (den meisten?) Anderen Linux-Systemen
/bin/sh
ist diesbash
der Grund, warum viele Skripte mit#!/bin/sh
ihrer Shebang-Zeile geschrieben werden, obwohl siebash
Erweiterungen verwenden.Wenn Sie
bash
Erweiterungen verwenden möchten , ist es am sichersten, diese auf allen Systemen anzugeben#!/bin/bash
. Auf diese Weise geben Sie ausdrücklich Ihre Abhängigkeit von anbash
. Sie müssen dies unter Debian und Ubuntu tun. Als zusätzlichen Bonus werden beim Start/bin/sh
bash
einige Erweiterungen deaktiviert ( Details finden Sie in der Beschreibung desbash
POSIX-Modus ). Daher#!/bin/bash
ist eine genaue Angabe erforderlich, damit Sie den vollen Nutzen daraus ziehen könnenbash
.Unter OS X
/bin/bash
ist auch verfügbar und/bin/sh
istbash
. Die Angabe#!/bin/bash
funktioniert auch dort.quelle
Ja, sowohl OSX als auch Linux werden mitgeliefert
/bin/bash
. Sie sollten absolut sicher sein. Dies ist jedoch kein POSIX. Die POSIX-Shell/bin/sh
funktioniert auf den meisten (allen?) Systemen. Dies ist der portabelste Ansatz und die einzige Möglichkeit, POSIX-kompatibel zu sein.Beachten Sie, dass auf vielen Systemen
/bin/sh
aufbash
, auf anderen auf verschiedene Shells verwiesen werden kann. Es istdash
zum Beispiel ein Symlink zu Debian und Ubuntu. Auch wenn/bin/sh
es sich um eine Verknüpfung handeltbash
, ändert sich das Verhalten der Shell, wenn sie aufgerufen wird alssh
(fromman bash
, emphasis mine):quelle
Wenn Kompatibilität mit "allen Unix-Systemen" unabdingbar ist - und wenn nicht, warum schreiben Sie ein Shell-Skript? - dann, ja, sollten Sie verwenden
#! /bin/sh
, da Bash nicht garantiert überall installiert werden kann , geschweige denn/bin
.Es ist tatsächlich viel, viel schlimmer. Wenn Sie Kompatibilität mit allen Unix-Systemen benötigen , gehören dazu Solaris und AIX, die ihre Shell-Umgebungen um 1995 eingefroren haben. Dies bedeutet, dass Sie Dinge wie die altmodische
sort +N
Syntax verwenden müssen - dass neuere Systeme weggefallen sind! Und es bedeutet auch, dass keine Shell-Funktionen, keine Arrays, keine[[ ... ]]
, keine${foo#glob}
, keine$(( ... ))
für die Arithmetik, möglicherweise keine$( ... )
-Stil-Befehlssubstitution, kleine und nicht dokumentierte Obergrenzen dafür, wie groß die Eingabe sein kann, ...Sie können wahrscheinlich davonkommen , wenn Sie sich nicht um so viel Kompatibilität kümmern, aber wenn es überhaupt ein Problem ist, empfehle ich Ihnen nachdrücklich, eine Sprache zu wählen, die weniger schrecklich ist als Shell. Der grundlegende Perl - Interpreter ist eher wahrscheinlich als Bash verfügbar sein.
quelle