Запишіть функцію в один рядок у ~ / .bashrc


40

Чому, коли я намагаюся записати функцію просто в один рядок у .bashrcфайл,

list(){ ls -a }

Я отримую помилку?

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

але коли я пишу це в багаторядкові, це нормально?

list(){
    ls -a
}

Існує пізніший еквівалентний запитання щодо переповнення стека .
sampablokuper

Відповіді:


33

Функції в 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скаржиться.


42

В ;кінці функції потрібне:

list(){ ls -a ; }

повинні працювати.

Синтаксис визначення функції для bash вказаний як

name () { list ; }

Зауважте, що він включає в себе а, ;що не є частиною list.

Те, що ;потрібно в цьому місці, є своєрідною синтаксичною аномалією. Це не bashконкретно, це те саме ksh, але це ;не потрібно в zsh.


18

Закінчення однієї команди (";") має на увазі новий рядок. У версії з однорядковою силою }аналізується як аргумент незакінченої ls -aкоманди. Що ви можете побачити, якщо зробите:

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

Подивіться, як команда всередині функції декларації проковтує зачіпну фігурну дужку?


2
Чудове пояснення! Тож це не просто синтаксична аномалія; в цьому насправді є якась логіка.
Дон Хатч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.