Bash脚本错误:“功能:未找到”。为什么会这样?

时间:2012-09-18 00:31:50

标签: bash shell unix ubuntu terminal

我正在尝试在我的Ubuntu计算机上运行bash script并且它给了我一个错误:

  

找不到功能

为了测试,我创建了以下脚本,它可以在我的笔记本电脑上正常工作,但不能在我的桌面上工作。任何想法为什么?如果相关,我的笔记本电脑就是Mac。

#!/bin/bash

function sayIt {   
   echo "hello world"
}

sayIt

这会在我的笔记本电脑上返回“hello world”,但在我的桌面上会返回:

  

run.sh:3:找不到函数hello world run.sh:5:语法错误:   “}”意外

4 个答案:

答案 0 :(得分:111)

有可能在您的桌面上,您实际上并未在bash下运行,而是dash或其他一些无法识别function关键字的POSIX兼容shell。 function关键字是一种基础,一种bash扩展。 POSIX语法不使用function并强制使用括号。

$ more a.sh
#!/bin/sh

function sayIt {   
   echo "hello world"
}

sayIt
$ bash a.sh
hello world
$ dash a.sh
a.sh: 3: function: not found
hello world
a.sh: 5: Syntax error: "}" unexpected

POSIX语法适用于:

$ more b.sh
#!/bin/sh

sayIt () {   
   echo "hello world"
}

sayIt
$ bash b.sh
hello world
$ dash b.sh
hello world

答案 1 :(得分:10)

我遇到了同样的问题,然后我修改了语法,它对我有用。尝试在功能名称后删除关键字 功能 添加方括号()

#!/bin/bash

sayIt()
{   
   echo "hello world"
}

sayIt

答案 2 :(得分:0)

ls -la / bin / sh

检查符号链接,它指向bash或破折号

答案 3 :(得分:-5)

在功能名称之后或在通话时是否需要()?

function sayIt() { ...
}

sayIt()

? :)

嗯,实际上,在我的Mac上,它就像你粘贴一样工作..

dtpwmbp:~ pwadas$ cat aa.sh 
#!/bin/bash

function sayIt() {   
   echo "hello world"
}

sayIt

dtpwmbp:~ pwadas$ ./aa.sh 
hello world
dtpwmbp:~ pwadas$ 

比较bash版本,AFAIR需要一些旧版本“()”。

dtpwmbp:~ pwadas$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
dtpwmbp:~ pwadas$ 

同时比较两种外壳上shopt选项(man bash)的状态,也许其中一个有一些compat语法打开或关闭?没有args的“shopt”命令将列出支持的选项状态。

What is the 'function' keyword used in some bash scripts?