Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash函数定义给出语法错误_Bash - Fatal编程技术网

bash函数定义给出语法错误

bash函数定义给出语法错误,bash,Bash,我不能仅为特定名称定义bash函数,当我使用()语法并且当我尝试在当前shell中定义它时(即不在子shell中) $cat-n test.sh 1函数f{true;} 2. 3 f(){true;} 4. 5函数使{true;} 6. 7使(){true;} $function f{true;}&&f(){true;}#OK $function make{true;}&&make(){true;}#NG bash:意外标记附近出现语法错误`(` $bash test.sh#好的 $source

我不能仅为特定名称定义bash函数,当我使用
()
语法并且当我尝试在当前shell中定义它时(即不在子shell中)

$cat-n test.sh
1函数f{true;}
2.
3 f(){true;}
4.
5函数使{true;}
6.
7使(){true;}
$function f{true;}&&f(){true;}#OK
$function make{true;}&&make(){true;}#NG
bash:意外标记附近出现语法错误`(`
$bash test.sh#好的
$source test.sh#NG
bash:test.sh:第7行:意外标记附近的语法错误`(`
bash:test.sh:第7行:`make(){true;}'
这里发生了什么?这是预期的行为吗?我相信,至少,这不是错误消息所暗示的意外标记“(”附近的语法错误


环境

$bash--版本
GNUBash,版本5.0.16(1)-发行版(x86_64-pc-linux-GNU)
版权所有(C)2019免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件;您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。

您有某种类型的
make
别名被触发。如果我创建了一个带有故意语法错误的别名,我可以重现这种情况:

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

别名仅以交互方式执行。它们在脚本中不处于活动状态,这解释了为什么只有在手动或使用
源运行命令时才会发生这种情况。中描述了问题的原因。我编写此答案是为了给出如何避免问题的解决方案

解决方案1

首先取消定义别名,然后定义函数。每次这样写(为了安全)似乎很麻烦,但这是符合POSIX的方法

unalias make
使(){true;}
解决方案2

或者使用另一种形式的函数定义。这很简单,但是

函数使{true;}
#或
函数make(){true;}

这不要紧。你可以覆盖一个系统名。你的语法看起来不错。我还在看它。我可以在命令行定义
函数make{echo bar;};make(){echo foo;};make--version
,如预期的那样,返回
“foo”
,所以我对你的错误有点困惑。同样的
GNU bash,版本5.0.16(1)-release(x86_64-pc-linux-gnu)
@DavidC.Rankin我对bash有多年的经验,但直到今天才遇到这个问题…@JohnKugelman无法在
gnubash版本5.0.3(1)-release(arm未知linux gnueabihf)上复制
在Raspberry Pi 3上。因此,问题可能是由于我的配置,但是否可以自定义bash以不接受特定的名称?我没有修改bash的源代码。我只是使用
source
作为搜索词浏览了man bash,在那里我也找不到任何解释。是的,我设置了
alias make='make--no builtin rules'
,但我不知道它甚至在函数定义的上下文中也会被扩展。非常感谢。我也不知道它,也没想到它会被扩展。我本以为括号会阻止别名扩展,但没有!