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


40

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

list(){ ls -a }

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

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

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

list(){
    ls -a
}

Есть позже, эквивалентный вопрос о переполнении стека .
Сампаблокупер

Ответы:


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.

Причина не указана, это всего лишь синтаксис.

Поскольку список в данной однострочной функции не заканчивается символом новой строки или a ;, bashжалуется.


42

В ;конце функции необходимо:

list(){ ls -a ; }

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

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

name () { list ; }

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

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


18

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

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

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


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