Sie sollten immer nur verwenden #! /bin/sh
.
Sie sollten niemals bash (oder zsh oder fish oder ...) -Erweiterungen in einem Shell-Skript verwenden.
Sie sollten immer nur Shell-Skripte schreiben, die mit einer Implementierung der Shell-Sprache funktionieren (einschließlich aller "Utility" -Programme, die mit der Shell selbst verbunden sind). In diesen Tagen können Sie wahrscheinlich nehmen POSIX.1-2001 ( nicht -2008) als maßgeblich für das, was die Shell und Dienstprogramme sind in der Lage, aber bewusst sein , dass Sie eines Tages aufgefordert werden , in den Hafen Ihr Skript an ein Legacy - System (zB Solaris oder AIX), deren Shell und Dienstprogramme um 1992 eingefroren wurden.
Was im Ernst ?!
Ja, im Ernst.
Hier ist die Sache: Shell ist eine schreckliche Programmiersprache. Das Einzige, was es zu bieten hat, /bin/sh
ist der einzige Skript-Interpreter, über den jede Unix-Installation garantiert verfügt.
Hier ist die andere Sache: Einige Iterationen des Perl 5-Interpreters ( /usr/bin/perl
) sind in einer zufällig ausgewählten Unix-Installation mit größerer Wahrscheinlichkeit verfügbar als in einer anderen (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
. Andere gute Skriptsprachen (Python, Ruby, node.js usw. - ich werde sogar PHP und Tcl in diese Kategorie aufnehmen, wenn ich sie mit Shell vergleiche) sind in etwa so verfügbar wie Bash und andere erweiterte Shells.
Wenn Sie die Möglichkeit haben, ein Bash-Skript zu schreiben, können Sie stattdessen eine Programmiersprache verwenden, die nicht schrecklich ist.
Nun, einfache Shell-Skripte, die nur ein paar Programme in einer Sequenz von einem Cron-Job oder so ausführen, es ist nichts Falsches daran, sie als Shell-Skripte zu belassen. Einfache Shell-Skripte benötigen jedoch weder Arrays noch Funktionen oder [[
Ähnliches. Und Sie sollten nur dann komplizierte Shell-Skripte schreiben, wenn Sie keine andere Wahl haben. Beispielsweise sind Autoconf-Skripte immer noch Shell-Skripte. Diese Skripte müssen jedoch auf jeder Inkarnation ausgeführt werden /bin/sh
, die für das zu konfigurierende Programm relevant ist. und das heißt, sie können keine Erweiterungen verwenden. Sie müssen sich heutzutage wahrscheinlich nicht mehr um alte proprietäre Unixe kümmern, aber Sie sollten sich wahrscheinlich um aktuelle Open-Source-BSDs kümmern, von denen einige nicht installiert werdenbash
standardmäßig und eingebettete Umgebungen, die Ihnen nur eine minimale Shell und busybox
.
Abschließend Sie der Moment finden sie wollen eine Funktion , die in der tragbaren Shell - Sprache nicht verfügbar ist, das ist ein Zeichen dafür , dass das Skript zu kompliziert worden ist ein Shell - Skript zu bleiben. Schreiben Sie es stattdessen in einer besseren Sprache um.
bash
Funktionen und Syntax anstelle vonsh
Funktionen und Syntax verwenden.