Почему, когда я пытаюсь записать функцию только в одной строке в .bashrc
файл,
list(){ ls -a }
Я получаю ошибку?
bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file
но когда я пишу это во много строке, это в порядке?
list(){
ls -a
}
Функции в bash
по сути являются именованными составными командами (или блоками кода). Из 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.
Причина не указана, это просто синтаксис.
Поскольку список в данной однострочной функции не заканчивается новой строкой или ;
, bash
жалуется.
Конец одиночной команды (";") подразумевается новой строкой. В однострочной версии }
анализируется как аргумент незавершенной команды ls -a
. Что вы можете увидеть, если сделаете:
$ foo(){ echo "a" }
}
$ foo
a }
Посмотрите, как команда внутри объявления функции проглатывает завершающую фигурную скобку?
В конце функции требуется ;
:
list(){ ls -a ; }
должен работать.
Синтаксис определение функции для bash указано как
name () { list ; }
Обратите внимание, что оно включает в себя ;
, который не является частью списка
.
Что ;
есть требуется в этом месте - своего рода синтаксическая аномалия. Это не bash
, то же самое для ksh
, но ;
не требуется в zsh
.