Die universellste Skriptsprache für Linux ist?

24

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?

Gilles 'SO - hör auf böse zu sein'
quelle
3
Ich würde raten sh.
Blender
Haben Sie eine Liste von Zieldistributionen? Oder obligatorische / wünschenswerte Distributionen, auf denen es laufen muss?
4
"Sch"? Was "sh"? Die Thomson-Shell? die Bourne-Shell? bash, ksh, pdksh, ash, zsh wie /bin/shauf system X oder Y gefunden ? Die POSIX-sh-Spezifikation, Die SUSv3-, SUSv4-sh-Spezifikation, Die LSB-sh-Spezifikation? "sh" an sich bedeutet nichts.
Stéphane Chazelas
1
Wenn es sich um Software-Builds und -Installationsskripts handelt, sollten Sie Autotools ausprobieren, mit denen systemübergreifende Kompilierungsprobleme behoben werden.
Lie Ryan
1
@sch Die üblichste Kreuzung "offensichtlich". Für den Fall, dass Leute, die mit Unix-Shells nicht vertraut sind, durch Ihren Kommentar in die Irre geführt werden, wird die POSIX-Spezifikation von fast allen zeitgenössischen Shells implementiert, die es wagen, den Namen zu tragen sh, und von Nichtkonformen sh, 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.
JW013

Antworten:

38

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/shwenn die erste Zeile vorhanden ist #!/bin/sh. Es gibt POSIX-Systeme, die shsich 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, die pipestatusVariable, 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 shProgramm, 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.

Gilles 'SO - hör auf böse zu sein'
quelle
1
"zum Teil gefördert durch ..." Das und alles andere als erforderlich in Fedora- und RHEL-Systemen.
Ignacio Vazquez-Abrams
Stimmen Sie dem größtenteils zu. Nur ein paar verschiedene Schwerpunkte: * Einige Distributionen basieren auf BusyBox, sind aber nicht unbedingt eingebettet (ich verwende eine, Alpine). (Zugegeben, die Antwort nicht sagen „fast immer“.) * BSDs ist eine große Klasse von Unix-ähnlichen Systemen , in denen Sie nicht bash standardmäßig annehmen können. * Dash kann fast alles, was Bash kann, es erfordert nur manchmal mehr Sorgfalt. * Wenn Sie eine anspruchsvollere Sprache benötigen, sind Perl und Python die gängigsten Optionen. Awk ist jedoch noch allgegenwärtiger und für viele Zwecke geeignet. Es wird auch häufig unterschätzt. Aber es ist leichter als Perl und Python.
dubiousjim
2
Eine gute Warnung - FreeBSD hat Perl vor einiger Zeit von seiner Standardinstallation gestrichen. Abgesehen davon kenne ich keine andere Distribution, die Perl nicht in ihrer Basisinstallation hat.
TC1
@ TC1 Perl war unter NetBSD immer optional. Es befindet sich im Basissystem von OpenBSD.
Gilles 'SO - hör auf böse zu sein'
@dubiousjim Nur Linux (nicht eingebettet oder eine gute Annäherung in der Praxis) und OSX haben Bash in ihrer Standardinstallation. * BSD haben pdksh oder mksh und kommerzielle Unices haben ATT ksh.
Gilles 'SO - hör auf, böse zu sein'
11

In Verfügbarkeitsreihenfolge:

  1. sh, aber bleibe bei POSIX-spezifizierten Einrichtungen.
  2. bash, aber vergiss nicht, es explizit im shebang anzugeben, sonst bekommst du vielleicht stattdessen einen Gedankenstrich.
  3. Python. Fast jeder benutzt es.
  4. Perl. Aber du darfst es schreiben.

Danach kümmert es niemanden wirklich, da es nicht viel gibt, was man nicht nur mit denen machen kann.

Ignacio Vazquez-Abrams
quelle
10
Ich würde PERL vor Python setzen, es ist in den meisten Linux-Systemen standardmäßig installiert.
Terdon
4
Perl ist # 3. Und du darfst es schreiben, Bonus! :)
Warren Young
2
Ich stimme mit @ignacio Perl ist # 4 und Python ist # 3. Der Grund liegt auf der Hand. Ich denke, Python ist die Evolution von Perl.
Bagavadhar
5
@ashwin: Nein, Python ist keine Evolution von oder wie Perl. Perl ist eine Sprache von Sysadmins für Sysadmins. Python ist eine Sprache von Programmierern für Programmierer. Dieser Unterschied ist entscheidend. Sie haben beide ihre Verwendungszwecke, und während es in Anwendungsfällen zu großen Überschneidungen kommen kann, ist für einige Aufgaben Perl die bessere Wahl, und für andere ist Python eindeutig überlegen.
cas
1
Ruby und PHP wurden von Perl inspiriert. Python ist das Ergebnis eines physikalischen Experiments, bei dem Anti-Perls in einem Supercollider erzeugt wurden. (Ich habe nichts gegen Python. Plusses und Minuspunkte, Plusses und Minuspunkte.)
Warren Young
4

Normalerweise würde ich sagen sh... aber da Sie Linux spezifiziert haben, werde ich sagen bash- 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 verwenden sh.

Nach bash(und sh) wäre die nächst "universellste" Skriptsprache für Linux ein Dialekt von awk- normalerweise entweder mawkoder gawk. 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 haben mawkund gawkverfügbar sein, aber auf einigen Distributionen (z. B. Debian) mawkist dies standardmäßig installiert und Sie müssen sich gawkselbst 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, was awkund sedkann und mehr. Mit ein wenig Mühe kann es die Dinge tun, dieshist 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-perlunter debian / ubuntu / etc) installiert werden , um ein CPAN-Modul in ein .deb-Paket umzuwandeln.

Ich würde es gerne als pythonnä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)

cas
quelle
Ich weiß , das ist eine alte Post, aber der beste Weg , dies zu umgehen , ist die Version in dem shebang angeben (zB /usr/bin/python2, /usr/bin/python3).
Isiah Meadows
1

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.

MeaCulpa
quelle
0

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.

zweifelhafter jim
quelle
1
awk-on-Linux ist allgemein bekannt. Mir fällt keine Distribution ein, die standardmäßig eine andere Variante hat.
Ignacio Vazquez-Abrams
5
Welche Linux-Varianten unterstützen das nicht bash?
Jonathan Leffler
1
Natürlich bashkann es auf (fast) jeder Linux-Box installiert und ausgeführt werden, aber viele Debian-Benutzer werden es nur installieren dashund es vorziehen, es nicht zu installieren bash.
William Pursell
6
@WilliamPursell Das Bash-Paket ist unter Debian mit dem Tag Essential versehen (dh Sie müssen zum Deinstallieren mehrere Schritte ausführen, mit zahlreichen Warnungen, dass dies Ihr System überfrachten wird). Bash ist auf nicht eingebetteten Linux-Systemen nahezu universell.
Gilles 'SO - hör auf, böse
1
@ JonathanLeffler: Eingebettete dagegen haben möglicherweise nur Busybox.
Mechanische Schnecke
0

Ich würde sagen, die Verfügbarkeit würde irgendwo in dieser Reihenfolge rangieren:

  1. Sch
  2. awk
  3. Perl (ich habe noch kein * nix ohne es gesehen, einschließlich BSDs)

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?

Earlz
quelle
0

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, cronund mail) zu verwenden. Dies ist ein typischer Anwendungsfall in vielen großen Unternehmen.

Schnelle Textverarbeitung

Nochmals die Muschel. Die Dienstprogramme wie grep, awk, sed, pasteund 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, scpund rsyncjeweils 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, pipmit 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.)

Barun
quelle
-1

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 ...

Marko V.
quelle
Ihre Aussage zu Solaris missing Perl ist falsch. Perl ist mindestens seit 2005 eine obligatorische Kernkomponente von Solaris (Solaris 10).
Juli