Perché quando provo a scrivere una funzione in una riga nel .bashrcfile,
list(){ ls -a }
Ricevo errore?
bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file
ma quando lo scrivo su più righe va bene?
list(){
ls -a
}
Perché quando provo a scrivere una funzione in una riga nel .bashrcfile,
list(){ ls -a }
Ricevo errore?
bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file
ma quando lo scrivo su più righe va bene?
list(){
ls -a
}
Risposte:
Le funzioni in bashsono essenzialmente denominate comandi composti (o blocchi di codice). Da man bash:
Compound Commands
A compound command is one of the following:
...
{ list; }
list is simply executed in the current shell environment. list
must be terminated with a newline or semicolon. This is known
as a group command.
...
Shell Function Definitions
A shell function is an object that is called like a simple command and
executes a compound command with a new set of positional parameters.
... [C]ommand is usually a list of commands between { and }, but
may be any command listed under Compound Commands above.
Non c'è motivo, è solo la sintassi.
Poiché l'elenco nella funzione di una riga fornita non viene chiuso con una nuova riga o un ;, si bashlamenta.
È ;necessario alla fine della funzione:
list(){ ls -a ; }
dovrebbe funzionare.
La sintassi di una definizione di funzione per bash è specificata come
name () { list ; }
Si noti che include un ;che non fa parte di list.
Che ;in questo posto sia richiesto è una specie di anomalia della sintassi. Non è bashspecifico, è lo stesso per ksh, ma non ;è richiesto in zsh.
La fine di un singolo comando (";") è implicita dalla nuova riga. Nella versione online }viene analizzato come argomento per il ls -acomando non terminato . Che puoi vedere se lo fai:
$ foo(){ echo "a" }
}
$ foo
a }
Vedi come il comando all'interno della dichiarazione di funzione ingoia la parentesi graffa finale?