Запишите функцию в одной строке в ~/.bashrc

Почему, когда я пытаюсь записать функцию только в одной строке в .bashrc файл,

list(){ ls -a }

Я получаю ошибку?

bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file

но когда я пишу это во много строке, это в порядке?

list(){
    ls -a
}
40
задан 1 November 2019 в 07:17

3 ответа

Функции в 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 жалуется.

36
ответ дан 23 November 2019 в 00:08

Конец одиночной команды (";") подразумевается новой строкой. В однострочной версии } анализируется как аргумент незавершенной команды ls -a . Что вы можете увидеть, если сделаете:

$ foo(){ echo "a" }
}
$ foo
a }

Посмотрите, как команда внутри объявления функции проглатывает завершающую фигурную скобку?

20
ответ дан 23 November 2019 в 00:08

В конце функции требуется ; :

list(){ ls -a ; }

должен работать.

Синтаксис определение функции для bash указано как

name () { list ; }

Обратите внимание, что оно включает в себя ; , который не является частью списка .

Что ; есть требуется в этом месте - своего рода синтаксическая аномалия. Это не bash , то же самое для ksh , но ; не требуется в zsh .

48
ответ дан 23 November 2019 в 00:08

Другие вопросы по тегам:

Похожие вопросы: