Wir schreiben Skripte für Linux-Systeme. Es gab einige Debatten darüber, welche der am weitesten verbreiteten Linux-Skriptsprachen verwendet werden soll. Bash, SH, Posix? Was?
linux
shell
scripting
portability
Gilles 'SO - hör auf böse zu sein'
quelle
quelle
sh
./bin/sh
auf system X oder Y gefunden ? Die POSIX-sh-Spezifikation, Die SUSv3-, SUSv4-sh-Spezifikation, Die LSB-sh-Spezifikation? "sh" an sich bedeutet nichts.sh
, und von Nichtkonformensh
, die heutzutage nicht mehr alt und selten sind (z. B. Bourne). Man kann eine ständig wachsende Liste von Erweiterungen und Variationen streichen, aber wenn das Ziel "universell" oder Portabilität ist, sollte man in die entgegengesetzte Richtung gehen. Gilles 'Antwort behandelt die Details eingehender.Antworten:
Es gibt zwei Programmierumgebungen, die auf jedem Unix-ähnlichen Betriebssystem verfügbar sind, die Turing-complete sind und andere Programme aufrufen können: awk und sh , die Bourne / POSIX-Shell-Familie. AWK ist auf die Textverarbeitung ausgerichtet (es ergänzt spezialisiertere Dienstprogramme), während es auf die Zusammenstellung von Programmen ausgerichtet ist. Sh ist die universelle Skriptsprache unter Linux und auf der ganzen Unix-Welt.
Der POSIX- Standard definiert die obligatorischen Funktionen von sh selbst und den zugehörigen Dienstprogrammen. Die meisten Unix-ähnlichen Systeme entsprechen POSIX 1003.1-2004 (auch bekannt als Single Unix v3, Open Group Base Specification, Ausgabe 6). Die neueste Version dieses Standards ist POSIX 1003.1-2008 (auch bekannt als Single Unix v4, Open Group Base Specification Issue 7).
Jedes Linux- und Unix- oder Unix-ähnliche System hat eine Shell im Bourne-Stil am Pfad
/bin/sh
, und jedes nicht-antike System hat eine POSIX-kompatible Shell (abgesehen von gelegentlichen Fehlern). Jedes moderne Unix-ähnliche System (einschließlich Linux) unterstützt Shebangs , sodass automatisch Skripts ausgeführt werden,/bin/sh
wenn die erste Zeile vorhanden ist#!/bin/sh
. Es gibt POSIX-Systeme, diesh
sich an einem anderen Ort befinden (normalerweise Emulationsebenen auf Betriebssystemen, die Sie nicht für wirklich Unix-artig halten würden).Eingebettete Linux-Systeme verfügen möglicherweise über ein reduziertes BusyBox- System, das nicht alle POSIX-Funktionen implementiert. BusyBox bietet eine große Anzahl von Optionen zur Kompilierungszeit, um Systemen mit geringem Platzbedarf gerecht zu werden. Daher ist es schwierig, im Voraus zu wissen, was Sie erwartet. Sie müssen Ihre Skripte an ein bestimmtes Gerät anpassen. BusyBox ist die häufigste Implementierung von sh und verschiedenen Dienstprogrammen mit geringem Platzbedarf. Ein weiteres Problem ist die extrem reduzierte Shell-Umgebung in Android (spätere Versionen sind weniger anämisch).
Nicht eingebettete Linux-Systeme haben fast immer entweder Bindestrich oder Bash as
/bin/sh
. Dash ist eine kleine und schnelle Shell, die kaum mehr als POSIX-Funktionen implementiert. Bash ist eine größere Shell mit mehr Funktionen.Auf nicht eingebetteten Linux-Systemen wird Bash fast immer als installiert
/bin/bash
. Daher können Sie für die Portabilität auf nicht eingebetteten Linux-Systemen davon ausgehen, dass bash verfügbar ist. Zu den nützlichen zusätzlichen Funktionen von bash gehören Arrays, die Möglichkeit, Punktdateien bequem zu verarbeiten, diepipestatus
Variable, mit der der Rückgabestatus aller Befehle in einer Pipeline abgerufen werden kann, zusätzliche Vergleichsoperatoren für die Dateizeiten und (in neueren Versionen) die Übereinstimmung mit regulären Ausdrücken .Eines der Merkmale der Shell-Programmierung ist, dass Sie nicht nur das
sh
Programm, sondern auch eine Reihe von Dienstprogrammen verwenden . Die meisten Dienstprogramme zur Dateibearbeitung und Textverarbeitung unter Linux sind GNU-Coreutils (auf eingebetteten Systemen sind sie normalerweise von BusyBox).Wenn Sie Portabilität über Linux hinaus benötigen, halten Sie sich am besten an POSIX. Bei anderen Unix-Varianten ist Bash möglicherweise nicht installiert (Bash ist Teil der Standardinstallation unter OSX, aber ein optionales Paket unter * BSD und den meisten kommerziellen Unices). Fast alle Unix-Varianten außer Linux und OSX (dh * BSD und kommerzielle Unices) haben eine Version der Korn-Shell , zumindest pdksh . Viele der praktischen Erweiterungen von bash sind von ksh, daher kann es nützlich sein, Skripte zu schreiben, die unter beiden ausgeführt werden können. Es kann jedoch etwas mühsam sein, zu erkennen, wo sich bash oder ksh auf einem unbekannten System befinden.
Die Shell kann nicht alles. Wenn Sie eine anspruchsvollere Sprache benötigen, sind Perl und Python die beiden häufigsten Optionen (alles andere ist weit hinter einer Unix-Skriptsprache zurückgeblieben). Perl ist die traditionelle Skriptsprache, und es fehlt wenigen nicht eingebetteten Linux-Systemen, aber Python gewinnt an Boden (was teilweise durch die empfohlene Skriptsprache für Ubuntu unterstützt wird). In der Nicht-Linux-Welt ist Perl Teil der Basisinstallation unter OSX und OpenBSD. Es ist optional, wird aber sehr häufig unter FreeBSD und optional, aber häufig unter NetBSD installiert.
quelle
In Verfügbarkeitsreihenfolge:
Danach kümmert es niemanden wirklich, da es nicht viel gibt, was man nicht nur mit denen machen kann.
quelle
Normalerweise würde ich sagen
sh
... aber da Sie Linux spezifiziert haben, werde ich sagenbash
- es ist garantiert auf jedem Linux-System verfügbar (naja, mit Ausnahme der obskuren, pedantisch winzigen, die den Minimalismus fetischisieren :).Wenn Sie sich nicht um Nicht-Linux-Portabilität kümmern müssen (und wenn Sie nicht auf winzigen Distributionen oder in eingebetteten Linux-Geräten wie Plastikbox-Routern laufen müssen), können Sie auch die erheblichen Verbesserungen nutzen, die diesbezüglich erforderlich sind es bietet über Ebene an
sh
. Ansonsten verwendensh
.Nach
bash
(undsh
) wäre die nächst "universellste" Skriptsprache für Linux ein Dialekt vonawk
- normalerweise entwedermawk
odergawk
. Wenn Sie bei Plain Awk bleiben und Gawkisms vermeiden, sollte Ihr Skript auf fast jedem Linux-System einwandfrei funktionieren (es kann auf winzigen Distributionen oder eingebetteten Geräten fehlen). Die meisten Linux-Systeme werden beides habenmawk
undgawk
verfügbar sein, aber auf einigen Distributionen (z. B. Debian)mawk
ist dies standardmäßig installiert und Sie müssen sichgawk
selbst installieren, wenn Sie dies wünschen.Als nächstes wäre
perl
. AFAIK, die Basis-Perl-Sprache, ist standardmäßig auf allen gängigen Linux-Distributionen installiert, daher ist es eine gute Wahl. Noch glücklicher ist, dass es mit Perl5-Releases nur sehr wenige Inkompatibilitäten gibt (obwohl Perl 5.12 oder 5.14 es endlich geschafft haben, einige dunkle Funktionen zu entfernen, die seit etwa 15 Jahren veraltet waren ... eine Warnung, sie nicht zu verwenden) Sofern Ihr Codierungsstil nicht wirklich verrückt ist und Sie die Warnungen eines Jahrzehnts ignorieren möchten, die Sie "nicht tun", werden Ihre Perl-Skripte nahezu überall einwandfrei ausgeführt. Die Sprache ist robust und mächtig und kann alles, wasawk
undsed
kann und mehr. Mit ein wenig Mühe kann es die Dinge tun, diesh
ist traditionell auch gut für (zB externe Befehle ausführen und die Ausgabe verwenden / leiten). Auch die Standard-Perl-Bibliotheken sind ziemlich umfangreich - sie decken mehr als nur die Grundlagen ab.Der einzige Haken bei Perl ist, dass es auch eine enorme Bibliothek von CPAN-Modulen gibt, mit denen Sie fast alles tun können (und vieles mehr, was Ihnen vielleicht nie einfällt) - und nicht alle werden auf jedem System mit Perl verfügbar sein . Sie sind in der Regel von sehr hoher Qualität, so dass Sie sich leicht daran gewöhnen können, sie nur zu verwenden. Wenn Sie sie jedoch verwenden, müssen Sie sicherstellen, dass sie installiert sind. Viele CPAN-Module sind für Linux vorinstalliert, und der Rest kann einfach mit dem cpan-Tool (oder
dh-make-perl
unter debian / ubuntu / etc) installiert werden , um ein CPAN-Modul in ein .deb-Paket umzuwandeln.Ich würde es gerne als
python
nächstes sagen können , aber ich kann es wirklich nicht. Es gibt viel zu mögen an Python, aber es ist nicht standardmäßig auf vielen Linux-Systemen enthalten und ehrlich gesagt ist es Versionskompatibilität (sowohl für Python selbst als auch seine angeblich "Standard" -Bibliotheken) ein komplettes Durcheinander. Einige Distributionen sind sehr bemüht, das Chaos zu beseitigen, andere nicht. Auch die Tatsache, dass Python im Grunde genommen eine Sprache ist, die von Programmierern (im Gegensatz zu Sysadmins) für Programmierer geschrieben wurde, und sie scheinen nicht zu glauben, dass das System, auf dem ihr Code installiert wird, überhaupt wichtig ist ... ihr Code ist wirklich super speziell, so dass sie sich nicht mit langweiligen Dingen wie der Integration in bestehende Systeme befassen müssen.(Verstehen Sie nicht die falsche Vorstellung von meinem Sarkasmus hier - ich mag Python wirklich als Sprache, ich hasse nur die Tatsache, dass Versions- und Abhängigkeitsmanagement eine PITA ist. Es ist, als ob man mehr als 20 Jahre in die Ära der manuellen Jagd nach Dunkelheit zurückversetzt wäre Bit Code und Patches, um etwas auf Ihrem proprietären System zu kompilieren und laufen zu lassen * nix)
quelle
/usr/bin/python2
,/usr/bin/python3
).Ich würde vorschlagen, ksh93 oder sogar POSIX zu folgen, und Sie können immer bash / zsh zum Ausführen verwenden.
Und Debian-basierte Distribution verwendet mawk nicht gawk als Standard-awk. Also ja, gawk Zugaben vermeiden, da mawk viel schneller ist.
quelle
Nicht verprügeln. Schreiben Sie in ein POSIX-nahes Format wie Strich oder Asche. Das wird am universellsten sein. Ich glaube nicht, dass es noch etwas gibt, das ein enger Konkurrent ist. (Und dies scheint mir eine sachliche Frage zu sein, keine "Meinung", wie sich einer der Kommentatoren beschwert.)
Wenn Sie etwas brauchen, das ein bisschen leistungsfähiger ist als sh (zum Beispiel, wenn Sie echte assoziative Arrays wollen), verwenden Sie awk. (Vermeiden Sie die Gawk-Erweiterungen. Es gibt viele Versionen von awk, aber es gibt einen weitgehend gemeinsamen Kern.) Das sollte fast so weit verbreitet sein wie sh.
quelle
bash
?bash
kann es auf (fast) jeder Linux-Box installiert und ausgeführt werden, aber viele Debian-Benutzer werden es nur installierendash
und es vorziehen, es nicht zu installierenbash
.Ich würde sagen, die Verfügbarkeit würde irgendwo in dieser Reihenfolge rangieren:
Obwohl Python wie eine gute Sprache klingt, habe ich in einer Basisinstallation kein Betriebssystem verwendet, das damit geliefert wurde, obwohl anscheinend Ubuntu dies vielleicht tut?
quelle
Ich glaube, die Experten hier haben bereits großartige Vorschläge gemacht, die Ihnen bei der Entscheidung helfen sollten. Die Verwendbarkeit und Verfügbarkeit der verschiedenen Shells wurde in den anderen Beiträgen gut beschrieben.
In einem anderen Sinne würde ich an Ihrer Stelle auch überlegen, welches Ziel ich mit den Skripten erreichen möchte. Jedes Werkzeug hat seine Vor- und Nachteile. Also, obwohl ich Python hauptsächlich benutze, werde ich das nicht in jedem Fall benutzen.
Ich kann mir ein paar Szenarien vorstellen und einige für sie nützliche Tools erwähnen.
FTP-Dateien hin und her; verarbeite sie; E-Mail-Benachrichtigungen senden; und so weiter
In diesem Fall ist es besser, bei der Shell (z. B. Bash) zu bleiben und die verschiedenen Dienstprogramme (z. B.
ftp
,cron
undmail
) zu verwenden. Dies ist ein typischer Anwendungsfall in vielen großen Unternehmen.Schnelle Textverarbeitung
Nochmals die Muschel. Die Dienstprogramme wie
grep
,awk
,sed
,paste
und andere sind sehr praktisch , in diesem Fall.Bauen
In der C / C ++ - Domäne ist dies das universelle Tool
make
. Die Java-Welt bevorzugt Apache ANT.Bereitstellung und Fernbedienung
Entweder die Shell oder Python. Zum Beispiel,
scp
undrsync
jeweils wäre sehr nützlich beim Kopieren die Datei (en) oder die Dateien zu synchronisieren.Python hingegen hat ein sehr nützliches Modul namens
fabric
. Dies ist nützlich für komplexere Vorgänge, z. B. zum Kopieren von Dateien, Stoppen eines Prozesses, Aufrüsten des Servers und dergleichen. Darüber hinaus stellt Python ein Modul zur Verfügung,pip
mit dem die angegebenen Abhängigkeiten durch Herunterladen und Installieren der entsprechenden Pakete gelöst werden können.(Beachten Sie, dass sich die obigen Vorschläge nicht auf die Shell- Funktionen konzentrieren , sondern vielmehr auf die verschiedenen verfügbaren Dienstprogramme.)
quelle
Perl ist nicht in FreeBSD-, NetBSD- oder DragonflyBSD-Basis, sorry. OpenBSD hat Perl in der Basisinstallation. OS X ist heutzutage ein zertifiziertes UNIX und kann auf einer bestimmten Ebene als eine Art BSD-Variante angesehen werden, auf der Perl, Python und Ruby installiert sind.
Viele proprietäre UNIXen haben Perl nicht in ihrer Basis, zum Beispiel Solaris, AFAIK, HP-UX oder IBM AIX auch nicht ...
quelle