Ошибка сценария Bash: «функция: не найдена». Почему это появилось?

55

Я пытаюсь запустить bash script на своем компьютере с Ubuntu, и он выдает ошибку:

функция не найдена

Для тестирования я создал следующий скрипт, который отлично работает на моем ноутбуке, но не на рабочем столе. Есть идеи, почему? Мой ноутбук - Mac, если это актуально.

#!/bin/bash

function sayIt {   
   echo "hello world"
}

sayIt

Это возвращает "привет мир" на моем ноутбуке, но на моем рабочем столе это возвращает:

run.sh: 3: функция не найдена hello world run.sh: 5: Синтаксическая ошибка: "}" неожиданно

Теги:
terminal

4 ответа

106

Скорее всего, на вашем рабочем столе вы фактически не работаете под bash, а скорее dash или какой-либо другой POSIX-совместимый shell, который не распознает ключевое слово function. Ключевое слово 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
  • 0
    wiki.ubuntu.com/DashAsBinSh
  • 2
    function происходит от оболочки korn, которая предшествует bash.
Показать ещё 3 комментария
7

Я столкнулся с той же проблемой, затем изменил синтаксис, и это сработало для меня. Попробуйте удалить ключевое слово функция и добавьте скобки() после имени функции.

#!/bin/bash

sayIt()
{   
   echo "hello world"
}

sayIt
0

Просто ты бежишь как

bash script.sh

потому что 'bash' имеет подходящую конфигурацию для переменных и пользовательскую конфигурацию для пользователя, работающего в текущем каталоге, вы должны настроить .bash_profile для дополнительной конфигурации

-4

Не требуется ли() после имени функции или при вызове?

function sayIt() { ...
}

sayIt()

?:)

Хм, на самом деле, на MY 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), на обеих оболочках, возможно, один из них включил или выключил синтаксис совместимости? Команда "shopt" без args отобразит состояние поддерживаемых опций.

Что такое ключевое слово 'function', используемое в некоторых сценариях bash?

  • 0
    Дает мне: Синтаксическая ошибка "(" неожиданно
  • 0
    К сожалению, я действительно не знаю, почему мой ответ на этот вопрос был отклонен: /
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню