Скрипт — обычный текстовый файл. Сам он ничего не делает: его строки выполняет другая программа.
Скрипт — текстовый файл с командами оболочки. Команды в нём те же, что ты набираешь в терминале, только записаны заранее. Выполняет их интерпретатор — программа, которая читает файл строку за строкой и выполняет каждую. Для скрипта коллеги интерпретатор — bash, та же оболочка, что работает в твоём терминале.
Кто читает файл, зависит от способа запуска. Посмотри на первую строку скрипта и на /bin/sh, а потом запусти скрипт, назвав интерпретатор явно.
Найди, кто читает скрипт
В ~/script-lab посмотри первую строку backup-notes.sh и на что указывает /bin/sh, а потом запусти скрипт командой bash.
Сначала предположи
Права x у файла по-прежнему нет. Что сделает bash backup-notes.sh?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
bash backup-notes.sh сам называет интерпретатор: bash открывает файл на чтение и выполняет его строки. Права на запуск ему не нужно — хватает права на чтение.
Первая строка #!/bin/bash — shebang: знаки #! и путь к интерпретатору. Она работает, когда файл запускают как программу — ./backup-notes.sh. Тогда ядро читает первую строку и запускает указанный в ней интерпретатор, передав ему файл. bash файл и sh файл на эту строку не смотрят: интерпретатор уже назван, а для оболочки строка с # — комментарий.
/bin/sh на Ubuntu — ссылка на dash. Это другая оболочка, маленькая и быстрая, и знает она только синтаксис, общий для всех оболочек. Строка 5 files=(todo.txt servers.txt) — список, такую запись понимает bash, а dash нет: отсюда Syntax error: "(" unexpected. Скрипт с #!/bin/bash запускают bash — явно или через shebang.