Ohne das ()
wäre die Syntax wirklich mehrdeutig.
Es muss sein , eine eindeutige Syntax zum Definieren einer Funktion und ohne wesentliche Änderung anderer Shell - Syntax, ist es dies nicht sein kann:
do_something {
# one or more commands go here
}
Sie sagten, dies "widerspricht nicht der aktuellen Syntax", aber es tut! Beachten Sie, dass Sie keinen Syntaxfehler erhalten, wenn Sie versuchen, die erste Zeile davon auszuführen . Sie erhalten einen Fehler, aber es handelt sich nicht um einen Syntaxfehler. Die zweite Zeile mit }
ist ein Syntaxfehler, die erste Zeile jedoch nicht. do_something {
Versuchen Sie stattdessen, einen aufgerufenen Befehl auszuführen do_something
und {
als Argument an diesen Befehl zu übergeben:
$ do_something {
do_something: command not found
Wenn bereits ein Befehl aufgerufen wurde do_something
, führen Sie ihn aus. Wenn bereits eine Funktion aufgerufen wurde do_something
, rufen Sie diese auf . Es ist im Allgemeinen wichtig, dass die Syntax eindeutig ist, aber es ist auch wichtig, dass es möglich ist, eine Funktion neu zu definieren, ohne sie versehentlich aufzurufen. Das Definieren und Aufrufen einer Funktion sollte nicht gleich aussehen.
Wie die Schale behandelt {
und (
.
Wie type {
Sie sehen werden, {
handelt es sich um ein Shell-Schlüsselwort. Das macht es so [[
. Wenn es in einer Situation verwendet wird, in der es sich ansonsten um einen Befehl handeln würde, enthält es eine {
spezielle Semantik. Insbesondere führt es eine Befehlsgruppierung durch. In anderen Situationen kann es jedoch ohne Fluchtzeichen verwendet werden, um ein wörtliches {
Zeichen zu kennzeichnen. Dies schließt die Situation ein, dass es als zweites oder nachfolgendes Wort eines Befehls übergeben wird.
Natürlich Bash könnte entworfen wurden , zu behandeln , {
anders als es gegenwärtig der Fall ist. Die Syntax wäre dann jedoch nicht mehr mit der POSIX-Shell kompatibel gewesen, und Bash wäre nicht wirklich eine Shell im Bourne-Stil und wäre nicht in der Lage, viele Shellskripten auszuführen.
Im Gegensatz dazu (
handelt es sich um ein Shell-Metazeichen. Es wird immer speziell behandelt , wenn es in einem Befehl erscheint und nicht in Anführungszeichen gesetzt (mit '
'
, "
"
oder \
). Es gibt also keine Mehrdeutigkeit in der Syntax:
do_something() {
# one or more commands go here
}
Das konnte nichts anderes bedeuten. Wenn Bash keine Funktionen hätte, wäre es ein Syntaxfehler, aus dem gleichen Grund echo foo(bar)
ein Syntaxfehler.
Wenn Ihnen die ()
Notation wirklich nicht gefällt, können Sie das Schlüsselwort verwenden function
und es weglassen, wenn Sudodus dies erwähnt . Beachten Sie, dass dies nicht Teil der Syntax zum Definieren von Funktionen in den meisten anderen Bourne-Shells ist. In einigen Fällen wird dies unterstützt, aber auf diese Weise definierte Funktionen haben eine andere Semantik. Daher ist ein Skript, das es verwendet, nicht portierbar. (Der Grund, warum diese Syntax eindeutig sein kann, ist, dass function
es sich bei dieser Syntax um ein Schlüsselwort in Bash handelt, das anzeigt, dass das, was darauf folgt, der Beginn einer Funktionsdefinition ist.)
Beachten Sie schließlich, dass die meisten Funktionsdefinitionen zwar {
in der Praxis verwendet werden, jedoch alle zusammengesetzten Befehle zulässig sind. Wenn Sie eine Funktion hatten, deren Körper Sie immer in einer Unterschale ausführen wollten, könnten Sie (
)
stattdessen verwenden {
}
.