使用最新的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
答案 0 :(得分:5)
参数存储数据,而不是代码。你还没有定义一个函数;你刚刚创建了一个看起来像函数定义和调用的字符串。
您可能会将其与
之类的内容混淆$ FOO="echo bar"
$ $FOO
bar
包含命令名称及其参数。展开$FOO
时,会查看生成的单词流,以确定哪个单词处于命令位置,哪些单词是参数。但是,函数定义不是命令;它的特殊语法不受命令行的正常评估策略的约束。
您的示例不是单个命令:它是一个命令 list ,它是由;
,&
,{{1}分隔的一个或多个命令},或&&
。
最后,||
没有执行任何操作;它只是开始参数扩展。是否执行扩展的结果取决于扩展发生的上下文。