Senza il ()
, la sintassi sarebbe davvero ambigua.
Ci deve essere qualche sintassi univoca per definire una funzione, e senza alterare sostanzialmente altra sintassi shell, non può essere questo:
do_something {
# one or more commands go here
}
Hai detto che "non si confonde con la sua sintassi attuale", ma lo fa! Si noti che non si ottiene alcun tipo di errore di sintassi quando si tenta di eseguire la prima riga . Viene visualizzato un errore, ma non si tratta di un errore relativo alla sintassi. La seconda riga, con }
, è un errore di sintassi, ma la prima non lo è. Invece, do_something {
tenta di eseguire un comando chiamato do_something
e passare {
come argomento a quel comando:
$ do_something {
do_something: command not found
Se esiste già un comando chiamato do_something
, lo stai eseguendo. Se esiste già una funzione chiamata do_something
, la stai chiamando . È importante in generale che la sintassi sia inequivocabile, ma è anche importante in particolare che sia possibile ridefinire una funzione senza chiamarla accidentalmente. Definire una funzione e chiamarla non dovrebbe avere lo stesso aspetto.
Come tratta la shell {
e (
.
Come type {
ti dirò, {
è una parola chiave shell. Questo lo rende come [[
. Se utilizzato in una situazione in cui sarebbe altrimenti un comando, {
porta una semantica speciale. In particolare, esegue il raggruppamento dei comandi. In altre situazioni, tuttavia, può essere usato senza caratteri di escape per indicare un {
carattere letterale . Ciò include la situazione del passaggio come seconda o successiva parola di un comando.
Naturalmente, Bash avrebbe potuto essere progettato per essere trattato in modo {
diverso rispetto a quello attuale. Tuttavia, la sua sintassi non sarebbe più stata compatibile con la shell POSIX e Bash non sarebbe davvero una shell in stile Bourne e non sarebbe in grado di eseguire molti script di shell.
Al contrario, (
è un metacarattere conchiglia. E 'sempre trattata in modo speciale se compare in un comando e non viene citato (con '
'
, "
"
o \
). Non vi è quindi alcuna ambiguità nella sintassi:
do_something() {
# one or more commands go here
}
Ciò non potrebbe significare nient'altro. Se Bash non avesse funzioni, sarebbe un errore di sintassi, per lo stesso motivo echo foo(bar)
è un errore di sintassi.
Se non ti piace davvero la ()
notazione, allora puoi usare la parola chiave function
e ometterla, come menziona il sudodus . Si noti che questo non fa parte della sintassi per la definizione delle funzioni nella maggior parte delle altre shell in stile Bourne - e in alcuni è supportato ma le funzioni definite in questo modo hanno una semantica diversa - e quindi uno script che lo utilizza non sarà portatile. (Il motivo per cui questa sintassi è in grado di essere inequivocabile è che function
è essa stessa una parola chiave in Bash che indica che qualunque cosa segua è l'inizio di una definizione di funzione.)
Infine, si noti che mentre la maggior parte delle definizioni delle funzioni utilizza {
in pratica, è consentito qualsiasi comando composto. Se avessi una funzione di cui avresti sempre voluto eseguire il corpo in una subshell, potresti usare (
)
piuttosto che {
}
.