Kann ich davon ausgehen, dass genug Leute zsh
installiert haben, um Skripte mit einem auszuführen?
#!/usr/bin/env zsh
als shebang?
Oder können meine Skripte dadurch auf zu vielen Systemen nicht mehr ausgeführt werden?
Klarstellung: Ich interessiere mich für Programme / Skripte, die ein Endbenutzer ausführen möchte (wie unter Ubuntu, Debian, SUSE, Arch usw.).
bash
zsh
portability
shebang
Profpatsch
quelle
quelle
zsh
möglicherweise populär, während es in anderen Kreisen ( Bankensektor) so gut wie unbekannt ist. Ich denke, Sie sollten viel mehr Informationen geben, wenn Sie diesbezüglich geeignete Ratschläge benötigen.zsh
auf keinem meiner Systeme installiert, und ich würde es nicht für ein einzelnes Skript installieren. Sie sollten sogar Bashismen vermeiden, obwohl Bash normalerweise verfügbar ist.Antworten:
Aus Gründen der Portabilität, nein. Es
zsh
kann zwar auf jedem Unix oder Unix-ähnlichen und sogar Windows-System zumindest über Cygwin kompiliert werden und ist für die meisten Open Source-Unix-ähnlichen und mehrere kommerzielle Systeme geeignet. In der Standardinstallation ist es jedoch im Allgemeinen nicht enthalten.bash
Auf der anderen Seite wird es auf GNU-Systemen installiert (genau wiebash
die Shell des GNU-Projekts), wie die große Mehrheit der nicht eingebetteten Linux-basierten Systeme und manchmal auch auf Nicht-GNU-Systemen wie Apple OS / X. Auf der kommerziellen Unix-Seite ist die Korn-Shell (die AT & T-Varianteksh88
) die Norm und beidesbash
undzsh
ist in optionalen Paketen enthalten. Auf dem BSDs ist, ist der bevorzugt interaktiv Shell ofttcsh
währendsh
entweder auf dem Almquist Shell basierte oderpdksh
undbash
oderzsh
Bedarf als optionale Pakete auch installiert werden.zsh
wird standardmäßig unter Apple OS / X installiert. Es war sogar das/bin/sh
Dort. Es ist standardmäßig in einigen Linux-Distributionen wie SysRescCD, Grml, Gobolinux und wahrscheinlich anderen zu finden, aber ich glaube nicht, dass es eine der wichtigsten ist.Wie für
bash
, es ist die Frage der installierten Version und infolgedessen die verfügbaren Funktionen. Beispielsweise ist es nicht ungewöhnlich, Systeme mitbash3
oder zu findenzsh3
. Es gibt auch keine Garantie, dass das Skript, für das Sie jetzt schreibenzsh5
, funktioniert,zsh6
obwohlbash
es versucht, die Abwärtskompatibilität aufrechtzuerhalten.Für Skripte ist meine Ansicht: Verwenden Sie die POSIX-Shell-Syntax, da alle Unices mindestens eine Shell haben, die aufgerufen wird
sh
(nicht unbedingt in/bin
) und in der Lage ist, diese Syntax zu interpretieren. Dann müssen Sie sich nicht so sehr um die Portabilität kümmern. Und wenn diese Syntax nicht ausreicht, brauchen Sie wahrscheinlich mehr als eine Shell.Dann haben Sie folgende Möglichkeiten:
quelle
Nein, du kannst nicht. Was garantiert verfügbar ist
/bin/sh
, ist im Wesentlichen die Original-Bourne-Shell. Fast alle (beachten Sie das "fast"!) Linux-Installationen werden bash haben, aber auf * BSD-Systemen ist es selten (die BSD-Persistenz hat ernsthafte Bedenken bezüglich GPL-Code, wie bash). Ich weiß nicht, was die Standard-Shell auf dem Mac ist, aber auch hier gibt es Bedenken bezüglich der GPL. Gleiches gilt für Solaris.zsh ist eine Nischen-Shell, die nicht in der Standardinstallation von Fedora enthalten ist (und ich glaube nicht, dass es für eine größere Distribution Standard ist).
quelle
bash
(obwohl diese Systeme wahrscheinlich nicht die Hauptsysteme sind) Ziel, das der OP für seine Frage im Auge hatte)Ich denke, es hängt wirklich davon ab, welche zsh- Zusatzfunktionen Sie verwenden und wo. Wenn Sie planen, Ihr Skript auf die verschiedenen Benutzer und Systeme zu verteilen, würde ich vorschlagen, bash oder sogar sh zu verwenden .
Zur gleichen Zeit, wenn Ihr Skript für die organisationsweite Ausführung konzipiert ist und Sie die Konvention haben, zsh auf Ihren Computern zu haben (zum Beispiel dieselbe grundlegende AMI) und Ihre Aufgabe klare Vorteile durch Erweiterungen wie erweiterte Dateiauswahlen oder andere Dinge von http: / /www.rayninfo.co.uk/tips/zshtips.html Ich würde sagen, mach weiter!
quelle
Wie bereits erwähnt,
bash
ist dies in der Standardinstallation für viele Distributionen üblich. Ihr Skript erreicht nicht die größte Benutzerbasis, wenn Sie sich auf verlassenzsh
.Eine wichtige Frage, die Sie vor dem Entwerfen Ihres Skripts beantworten müssen, lautet: " Warum spielt es eine Rolle, in welcher Shell ein Skript ausgeführt wird? "
Unterschiedliche Shells verwenden unterschiedliche Syntax oder bieten zusätzliche Shell-Funktionen, die von anderen Shells möglicherweise nicht unterstützt werden. Um ein Skript für die "allgemeine Linux-Endbenutzerwelt" zu schreiben, stellen Sie fest, ob Ihr Skript Syntax- oder Shell-Funktionen verwendet, die von einer bestimmten Shell-Umgebung abhängen.
Beispielsweise unterstützt die
bash
Shell bestimmte Erweiterungen, die von derdash
Bourne-Shell nicht unterstützt werden oder/bin/sh
auf die auf dem System des Benutzers verwiesen wird.Wenn Sie versuchen,
echo {1..10}
mit im/bin/sh
Vergleich zu auszuführen , erhalten/bin/bash
Sie eine sehr unterschiedliche Ausgabe.Das Gleiche gilt für
zsh
das, obwohl es die meistenbash
Syntaxfunktionen unterstützt, zusätzliche Erweiterungen und Syntaxfunktionen bietet, die von derbash
Shell nicht unterstützt werden . In diesen Tabellen finden Sie Beispiele für den Vergleich von Schalen .Sie können Ihre potenzielle Benutzerbasis darüber hinaus erweitern,
bash
indem Sie Skripts verwenden, die beim Aufrufen mit funktionieren#!/bin/sh -u
. Dies wirft jedoch eine weitere wichtige Frage auf: " Was wird im Austausch für mehr Portabilität geopfert? "Stellen Sie fest, ob Unterschiede in Bezug auf Sicherheitsbedenken, Funktionalität, Effizienz oder andere Aspekte, die Ihrer Meinung nach für Ihr Skript Priorität haben, das Opfer wert sind. Möglicherweise möchten Sie ein Skript mit einer bekannten Sicherheitslücke nicht in großem Umfang verwenden, nur weil es in mehreren Umgebungen funktioniert.
Es sind so viele Skripte dafür geschrieben,
bash
dass die Unterstützung dieser Skripte als Kriterium beim Vergleich von Befehlsshells verwendet wird . Es können viel mehr Benutzer Ihr Skript ausführen, als wenn es aufzsh
einer Shell-Umgebung oder einer anderen Syntax basiert.Bedenken Sie auch, dass Sie letztendlich keine Kontrolle darüber haben, wie der Benutzer das Skript ausführt (auch nützlich zum Debuggen von Skripten in verschiedenen Shells ):
Das Beste, was Sie dagegen tun können, ist, Ihre Skripte portabel zu machen, solange es keine großen Einbußen bei der Funktionsweise gibt.
Möglicherweise werden auch Konventionen für die Bash-Codierung angezeigt - Stapelüberlauf .
quelle
Das einzige, was Sie fast garantieren können, ist, dass es eine gibt
/bin/sh
. Dies kann eine statisch verknüpfte Shell oder eine Verknüpfung zu einer anderen Shell sein. Diese andere Shell erkennt normalerweise, dass sie als sh bezeichnet wird, und wird im Kompatibilitätsmodus ausgeführt.Beachten Sie die fast im ersten Satz.
Jedes Unix-ähnliche System, an dem ich jemals gearbeitet habe, hatte es. Viele von ihnen hatten auch bash installiert (aber nicht alle . Bsp Bash ist nicht standardmäßig auf einigen BSDs installiert. Einige Linux-Distributionen werden mit DASH , der Debian Almquist-Shell, ausgeliefert.
Was Sie garantieren können, sind Ihre Installationsanweisungen. Sie können der README-Datei eine Zeile hinzufügen, in der angegeben wird, dass zsh erforderlich ist. Wenn Sie ein Paket erstellen, können Sie zsh als Abhängigkeit markieren. Sie können dies mit den autoconf / automake-Tools überprüfen. Sie können überprüfen, ob zsh im Installationsskript gefunden wird (starten Sie mit / bin / sh und versuchen Sie, zsh zu finden, falls gefunden, fahren Sie fort. Wenn kein Fehler angezeigt wird, z. B. "Warnung: ZSH ist nicht installiert. Bitte lesen Sie die Installationsanweisungsdatei! ".)
Ich bin sicher, ich habe noch ein paar Optionen vergessen. Die wichtigsten Punkte sind jedoch:
quelle
/bin/sh
. Es erfordert ein Verhalten,sh
das sich in der richtigen Umgebung (die nicht die Standardumgebung sein muss) wie angegeben verhält./bin/sh
ist möglicherweise keine POSIX-Shell. Unter Solaris 10 und früheren Versionen war es beispielsweise noch eine Bourne-Shell, in der der Standard enthaltensh
war/usr/xpg4/bin
.