Терминал Mac OSx: «недопустимый идентификатор» в определении функции - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть скрипт bash, в котором я определяю нижеприведенную функцию,

function start-if-exists()
{
    if [ "`docker container ls -a|grep $1`" ]; then
        echo "Container $1 exists. Starting $1..."
        return `docker start $1`
    else
        echo "Container $1 doesn't exists."
        return ""
    fi
}

При непосредственном выполнении вышеуказанной функции в терминале (zsh) я не получаю никакой ошибки.Но когда я выполняю его с помощью команды sh (sh my_script.sh), я получаю следующую ошибку:

my_script.sh: строка 10: `start-if-существующие ': недопустимоидентификатор

, где my_script.sh - имя файла.

Чего мне не хватает, так как мой скрипт работает с zsh, но не работает в sh?

1 Ответ

0 голосов
/ 18 ноября 2018

/bin/sh равно bash, но при запуске как /bin/sh запускается в режиме POSIX.Согласно справочной странице bash, в режиме POSIX:

Имена функций должны быть действительными именами оболочки.То есть они не могут содержать символы, отличные от букв, цифр и символов подчеркивания, и могут не начинаться с цифры.Объявление функции с недопустимым именем приводит к фатальной синтаксической ошибке в неинтерактивных оболочках.

Примечание о том, как разобраться в таких вещах:

  • В командной строке терминала я выполнил /bin/sh --version, чтобы увидеть информацию об этом.На нем было напечатано «GNU bash, версия 3.2.57 (1) -релиз (x86_64-apple-darwin17)».
  • Затем я обратился к справочной странице bash, используя команду man bash.Поскольку это долго, вы можете предпочесть сохранить копию в файл и просмотреть ее в предпочитаемом вами текстовом редакторе.Необработанный вывод man включает архаичные подчеркивания и возвраты.Вы можете получить копию без них, выполнив man bash | col -b > file.txt.
  • На странице справочника я искал «sh» (как полное слово, а не простой поиск этих букв, так как они появляются как частимного несвязанных слов).Это быстро показало, что bash ведет себя по-разному, когда начинается с «sh»;он запускается в режиме POSIX.
  • При дальнейшем поиске «POSIX» был обнаружен список вещей, отличающихся в режиме POSIX.
...