Я пытаюсь запустить bash script
на своем компьютере с Ubuntu, и он выдает ошибку:
функция не найдена
Для тестирования я создал следующий скрипт, который отлично работает на моем ноутбуке, но не на рабочем столе. Есть идеи, почему? Мой ноутбук - Mac, если это актуально.
#!/bin/bash
function sayIt {
echo "hello world"
}
sayIt
Это возвращает "привет мир" на моем ноутбуке, но на моем рабочем столе это возвращает:
run.sh: 3: функция не найдена hello world run.sh: 5: Синтаксическая ошибка: "}" неожиданно
Скорее всего, на вашем рабочем столе вы фактически не работаете под 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
Я столкнулся с той же проблемой, затем изменил синтаксис, и это сработало для меня. Попробуйте удалить ключевое слово функция и добавьте скобки() после имени функции.
#!/bin/bash
sayIt()
{
echo "hello world"
}
sayIt
Просто ты бежишь как
bash script.sh
потому что 'bash' имеет подходящую конфигурацию для переменных и пользовательскую конфигурацию для пользователя, работающего в текущем каталоге, вы должны настроить .bash_profile для дополнительной конфигурации
Не требуется ли() после имени функции или при вызове?
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?
function
происходит от оболочки korn, которая предшествует bash.