Write function in one line into ~/.bashrc
Why when I try to write a function just in one line into .bashrc
file,
list(){ ls -a }
I get error?
bash: /home/username/.bashrc: line num: syntax error: unexpected end of file
but when I write it in multi line it's ok?
list(){
ls -a
}
There is a ;
needed at the end of the function:
list(){ ls -a ; }
should work.
The syntax of a function definition for bash is specified as
name () { list ; }
Note that it includes a ;
that is not part of the list
.
That the ;
is required in this place is kind of a syntax anomaly. It is not bash
specific, it's the same for ksh
, but it the ;
is not required in zsh
.
Functions in bash
are essentially named compound commands (or code blocks). From 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.
There's no reason given, it's just the syntax.
Since the list in the one-line function given isn't terminated with a newline or a ;
, bash
complains.
The end of a single command (";") is implied by the newline. In the oneline version }
is parsed as an argument to the unterminated ls -a
command. Which you can see if you do:
$ foo(){ echo "a" }
}
$ foo
a }
See how the command inside the function declaration swallows the trailing curly brace?