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

时间:2017-02-16 12:52:21

标签: bash shell

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

$ foo() { echo bar; }; foo
bar

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

$ FOO='foo() { echo bar; }; foo'
$ echo $FOO
foo() { echo bar; }; foo
$ $FOO
-bash: foo(): command not found

1 个答案:

答案 0 :(得分:5)

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

您可能会将其与

之类的内容混淆
$ FOO="echo bar"
$ $FOO
bar

包含命令名称及其参数。展开$FOO时,会查看生成的单词流,以确定哪个单词处于命令位置,哪些单词是参数。但是,函数定义不是命令;它的特殊语法不受命令行的正常评估策略的约束。

您的示例不是单个命令:它是一个命令 list ,它是由;&,{{1}分隔的一个或多个命令},或&&

最后,||没有执行任何操作;它只是开始参数扩展。是否执行扩展的结果取决于扩展发生的上下文。