1

У меня есть этот скрипт, который я использую на Centos в течение многих лет. Я сейчас вызываю тот же скрипт на Raspberry Pi и получаю эту ошибку:

/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found

Это скрипт, который находится в файле с именем backup_all.sh. Я звоню из командной строки и cron, используя sh backup_all.sh.

#!/bin/sh
function backup
{
    sh "/media/Backups/backup.sh" $1 $2 filter-list.txt
}
backup myserverhostname.com 22

Я также попытался поместить исходный файл backup.sh или «source /media/Backups/backup.sh» вверху, и это не сработало.

Странно то, что он действительно вызывает скрипт backup.sh, потому что я получаю дальнейшие ошибки от этого.

Если я вызываю исходный скрипт прямо из командной строки (например, sh "/media/Backups/backup.sh" myserverhostname.com 22 filter-list.txt), он работает нормально, поэтому я не думаю, что там есть ошибки.

Если я не использую функцию и просто вызываю sh "/media/Backups/backup.sh" myserver 22 filter-list.txt в файле backup_all.sh, то это также работает нормально. Так что, кажется, только при использовании в функции.

Для информации, я включаю скрипт в другой скрипт, потому что я выполняю эту функцию на многих серверах, поэтому я вызываю функцию резервного копирования в этом файле много раз, это было проще, чем вызывать его специально для каждого сервера. Но чтобы заставить его работать, я удаляю функцию и вызываю каждую строку отдельно, но было бы хорошо узнать, почему я не могу использовать ту же функцию, что и в Centos.

1 ответ1

2

Похоже, что /media/Backups/backup.sh является сценарием Bash, а не стандартным (POSIX) сценарием оболочки. Аналогично, синтаксис для backup_all.sh действителен только для Bash.

В Bash source является встроенным, а function - ключевым словом оболочки, но они не указаны в стандарте POSIX для sh, интерпретатора команд оболочки. Шебанг в ваших сценариях #!/bin/sh который указывает ядру использовать /bin/sh для интерпретации скрипта.

Причина того, что оба сценария оболочки работали с CentOS, заключается в том, что дистрибутивы на основе Red Hat создают /bin/sh в качестве символической ссылки на /bin/bash . Bash (в основном) совместим с POSIX, но расширяет его возможности несколькими способами. В недавних производных Debian (таких как Raspbian) /bin/sh является символической ссылкой на /bin/dash , оболочку POSIX, которая более строга совместима (но также более легка и быстрее, чем Bash). Вот почему следующие ошибки выдаются интерпретатором сценария:

/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found

Это можно исправить с помощью:

  1. Явно указав Bash в качестве интерпретатора в вашей функции backup() как bash /media/Backups/backup.sh "$1" "$2" filter-list.txt (обратите внимание, что переменные указаны в кавычках).
  2. Явно указав Bash как шебанг для backup_all.shbackup.sh)

    #!/bin/bash
    

В качестве альтернативы перепишите оба сценария, чтобы они были совместимы с POSIX, и продолжайте использовать /bin/sh в качестве интерпретатора. Смотрите вики-статью об Ubuntu, Dash as /bin /sh для получения дополнительной информации об этом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .