Scrivi la funzione su una riga in ~ / .bashrc


40

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
}

C'è una domanda successiva ed equivalente su StackTranslate.it .
sampablokuper

Risposte:


33

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.


42

È ;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.


18

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?


2
Grande spiegazione! Quindi non è solo un'anomalia della sintassi; c'è in realtà qualche logica ad esso.
Don Hatch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.