Linux shell无法通过美元运算符调用函数

gri*_*yvp 0 bash shell

使用最新的Ubuntu默认shell(bash兼容)我可以创建一个单行函数并调用它:

$ foo() { echo bar; }; foo
bar
Run Code Online (Sandbox Code Playgroud)

但是如果我使用相同的命令创建一个字符串并通过它执行它$,则不会调用函数.shell函数语法的哪个部分我不明白?

$ FOO='foo() { echo bar; }; foo'
$ echo $FOO
foo() { echo bar; }; foo
$ $FOO
-bash: foo(): command not found
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

参数存储数据,而不是代码.你还没有定义一个函数; 你刚刚创建了一个看起来像函数定义和调用的字符串.

你可能会把它与类似的东西混淆

$ FOO="echo bar"
$ $FOO
bar
Run Code Online (Sandbox Code Playgroud)

其中包含命令名称及其参数.当$FOO展开时,然后查看得到的单词流以识别哪个单词处于命令位置以及哪些单词是自变量.但是,函数定义不是命令; 它的特殊语法不受命令行的正常评估策略的约束.

您的例子是不是一个单一的命令:它是一个命令列表,这是通过分开的一个或多个命令;,&,&&,或||.

最后,$不执行任何事情; 它只是开始参数扩展.是否执行扩展的结果取决于扩展发生的上下文.