bash определение функции дает синтаксическую ошибку - PullRequest
3 голосов
/ 05 мая 2020

Я не могу определить bash функцию только для специфицированных c имен и когда я использую синтаксис <function name>() и когда я пытаюсь определить это в текущей оболочке (т.е. не в подоболочке).

$ cat -n test.sh 
1   function f { true; }
2   
3   f() { true; }
4   
5   function make { true; }
6   
7   make() { true; }

$ function f { true; } && f() { true; } #OK

$ function make { true; } && make() { true; } #NG
bash: syntax error near unexpected token `(`

$ bash test.sh #OK

$ source test.sh #NG
bash: test.sh: line 7: syntax error near unexpected token `(`
bash: test.sh: line 7: `make() { true; }'

Что здесь происходит? Это ожидаемое поведение? По крайней мере, я считаю, что это не синтаксическая ошибка рядом с неожиданным токеном `(', как следует из сообщения об ошибке.


Environment

$ bash --version
GNU bash, version 5.0.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

У вас есть своего рода псевдоним make, который запускается. Я могу воспроизвести это, если создам псевдоним с целенаправленными синтаксическими ошибками:

$ alias make='@)$*)@'
$ make() { true; }
bash: syntax error near unexpected token `)'

Псевдонимы выполняются только в интерактивном режиме. Они не активны внутри скриптов, что объясняет, почему это происходит только тогда, когда вы запускаете команду вручную или с source.

0 голосов
/ 05 мая 2020

Причина проблемы описана в ответе Джона . Я пишу этот ответ, чтобы дать решения, как избежать проблемы.

Решение 1

Сначала отмените определение псевдонима, а затем определите функцию. Писать подобное каждый раз (в целях безопасности) кажется проблематичным, но это POSIX-совместимый способ.

unalias make
make() { true; }

Решение 2

Или используйте другую форму функции определения. Это просто, но не POSIX-совместимый .

function make { true; }
#or
function make() { true; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...