Sollte ich eine Shell-Funktion als Funktion x () oder nur x () definieren?

7

Ich habe festgestellt, dass es drei Möglichkeiten gibt, Shell-Funktionen zu definieren, und ich habe sie nirgendwo anders erklärt.

%Vor%

Gibt es zwischen diesen drei Definitionen einen Unterschied? Verhalten sie sich anders, oder ist es nur das Aussehen?

Gibt es einen Standard, der verwendet werden sollte? Ich würde erwarten, dass die erste Option vorzuziehen wäre, da ich mir vorstelle, dass sie irgendwo auf der anderen Seite Unklarheiten beseitigt.

Vielen Dank im Voraus!

Nach der Antwort bearbeiten : Wer hat als "meinungsbasiert" geschlossen? Ich fragte nach dem Unterschied im Verhalten, nicht nur, warum Leute denken, dass ich welches verwenden sollte. Es gibt einen großen Unterschied in der Tatsache, dass man nur in Bash unterstützt wird, was bedeutet, dass jeder darauf abzielen sollte, die zweite Option zu verwenden.

    
whitfin 06.03.2014, 23:00
quelle

6 Antworten

7

Der Nachteil von Option 1 und 3 ist, dass beide so genannte "bashisms" sind. Wenn Sie Cross-Shell-Kompatibilität wünschen (z. B. mit sh in * BSDs), verwenden Sie Option 2, da jede POSIX-Shell diese unterstützen muss.

    
nwk 06.03.2014, 23:12
quelle
11
%Vor%

wird von der Bourne Shell-Familie und jeder Art von Derivaten (Bindestrich, Yash) unterstützt Ist die POSIX-Standard-Syntax und wahrscheinlich diejenige, die Sie verwenden möchten, um etwas zu schreiben, das mit alten Systemen kompatibel ist. Wahrscheinlich ist diejenige, die Sie verwenden möchten.

%Vor%

Wird von bash und zsh unterstützt, aber mit function und ist () einfach FALSCH und sollte vermieden werden.

%Vor%

Ist die Korn Shell-Syntax und wird aus Kompatibilitätsgründen von bash und zsh unterstützt, ist aber nicht POSIX

Ein Zitat aus Ссылка über "function log ()"

Dies ist eine Verschmelzung zwischen den Korn- und POSIX-Stil-Funktionsdefinitionen - sowohl mit dem Funktionsschlüsselwort als auch mit Klammern. Es hat keinen nützlichen Zweck und keine historische Grundlage oder einen Grund zu existieren. Es wird von POSIX nicht angegeben. Es wird von Bash, mksh, zsh und vielleicht einigen anderen Korn-Shells akzeptiert, wo es als identisch mit der POSIX-Stil-Funktion behandelt wird. Es wird von AT & amp; T ksh nicht akzeptiert. Es sollte niemals verwendet werden. Siehe die nächste Tabelle für das Funktionsschlüsselwort. Bash hat diese Funktion nicht als ausdrücklich veraltet dokumentiert.

    
v-a 06.03.2014 23:18
quelle
6

Ein bisschen Geschichte

Verwenden Sie für absolute Bourne-Shell- und POSIX-Kompatibilität log () { ...; } . Dies ist besonders wichtig bei älteren Unix-Systemen und kleinen Linux-Distributionen, die minimale Shell-Implementierungen beinhalten.

Es gab einen besonderen Grund für David Korn, das Schlüsselwort function einzuführen. Er wollte hinzufügen Features zu Funktionen in ksh (ksh93) und wollte eine klare Unterscheidung zwischen normalen Funktionen und erweiterten Funktionen machen.

In ksh93 können Funktionen, die mit function name { ...; } definiert sind, lokale Variablen verwenden, wenn sie das sind deklariert mit typeset var=value .

Bash verwendet die Schlüsselwörter declare und local , und afaik arbeiten sie in beiden Arten von Funktionen. Sogar typeset ist ein Synonym für declare .

Die gemischte Syntax, sowohl function als auch () , ist weder mit Bourne, ksh oder POSIX kompatibel.

In meinem eigenen ksh-Code tendiere ich dazu, viele Funktionen zu verwenden, und lokale Variablen neigen dazu, den Code zu verbessern. Wenn ich erwarte, dass der Code in einer allgemeineren Shell als ksh93 wiederverwendet wird, werde ich zu POSIX-Style-Funktionen zurückkehren und Subshells verwenden, um Variablen lokal zu zwingen.

    
Henk Langeveld 06.03.2014 23:42
quelle
2

Laut dem Bash Hackers Wiki ist das function Schlüsselwort nutzlos und sollte niemals verwendet werden, da es nicht portierbar ist. Scheinbar erlauben nur bash und andere ksh-abgeleitete Shells beides, und das Schlüsselwort function ist ein mittlerweile veralteter Rückfall in ksh-ähnliche Funktionen. Die folgenden Referenzen geben eine bessere Erklärung:

Ссылка

Ссылка

Ссылка

    
Mike Holt 06.03.2014 23:21
quelle
1

Es gibt einen großen Unterschied: Portabilität . Das Schlüsselwort function ist nicht POSIX und wird nur von bash und ksh unterstützt.

    
jan groth 06.03.2014 23:12
quelle
1

Das ist nur Ihr persönlicher Anruf, da beide Syntaxen gut funktionieren. Aber dieser:

%Vor%

ist die ursprüngliche Bourne- und MODERN POSIX-Syntax.

    
anubhava 06.03.2014 23:10
quelle

Tags und Links