🐛 Частые ошибки — Занятие 12

К оглавлению урока

⚡ Топ-3 ошибки

  1. Забыли chmod +xPermission denied при ./script.sh
  2. Забыли shebang #!/bin/bash → скрипт запускается через sh (может отличаться)
  3. Пробелы вокруг =: name = "x" — ошибка; правильно: name="x"

Ошибка 1: Permission denied — забыли chmod +x

Симптом

./script.sh
# -bash: ./script.sh: Permission denied

Причина

У файла нет бита выполнения x. ./script.sh пытается запустить файл как программу, но система отказывает — у вас нет права на выполнение.

Диагностика

ls -la script.sh
# -rw-r--r--  1 alice devs  128 Jun 11 10:01 script.sh
#  ^^^
#  нет x — только rw

Решение

chmod +x script.sh
./script.sh   # теперь работает

Ошибка 2: Забытый shebang

Симптом

Скрипт работает через bash script.sh, но ведёт себя непредсказуемо при ./script.sh, или появляются ошибки синтаксиса.

Причина

Без shebang система запускает скрипт через /bin/sh (POSIX-совместимый sh), а не через Bash. Функции Bash (массивы, [[ ]], $(())) могут не работать в sh.

Диагностика

head -1 script.sh
# echo "Hello"   <-- нет #!/bin/bash на первой строке!

Решение

Первая строка всегда должна быть shebang #!/bin/bash — иначе строка станет обычным комментарием:

#!/bin/bash
echo "Hello $name"

Ошибка 3: Пробелы вокруг = в переменной

Симптом

name = "Andrew"
# -bash: name: command not found

Причина

В bash пробелы вокруг = недопустимы. При наличии пробелов bash интерпретирует name как команду и пытается её выполнить — и получает ошибку.

Решение

name="Andrew"    # ПРАВИЛЬНО: без пробелов
echo "Hello $name"

Ошибка 4: bash script.sh «работает», а ./script.sh нет

Ситуация

bash script.sh    # выводит результат
./script.sh       # Permission denied или ничего

Объяснение

bash script.sh явно вызывает интерпретатор Bash и передаёт файл как аргумент — права на x НЕ проверяются. ./script.sh просит операционную систему запустить файл как программу — и тут права проверяются.

Вывод: «работает через bash script.sh» означает только то, что скрипт синтаксически корректен. Права на исполнение — отдельная история.

Решение

chmod +x script.sh
./script.sh
⚠️ ОПАСНО: chmod 777 — антипаттерн
Когда что-то «не работает по правам», первый импульс — дать chmod 777 всему. Это плохая практика и серьёзная дыра в безопасности.

chmod 777 file даёт права на чтение, запись и исполнение всем пользователям системы — включая посторонних. Никогда не применяйте к конфигурационным файлам, SSH-ключам, базам данных.

Для SSH-ключа: chmod 600 ~/.ssh/id_rsa
Для скрипта (исполняемый только для вас): chmod 700 script.sh
Для публичного скрипта: chmod 755 script.sh
⚠️ ОПАСНО: rm -rf без проверки пути
rm -rf удаляет необратимо. Особая ловушка в bash-скриптах — переменная с путём.

Если переменная не задана или пуста:
DIR=""
rm -rf $DIR/data → интерпретируется как rm -rf /data

Правило: в скриптах всегда проверяйте переменные перед использованием в путях. Либо используйте кавычки и проверки: [ -n "$DIR" ] && rm -rf "$DIR/data"

Ошибка 5: echo $name без кавычек при пустой переменной

Симптом

echo Hello $name
# Hello         (пустая строка вместо имени)

Причина

Переменная name не объявлена или объявлена некорректно. Без $ — выводится текст «name». С $name при пустой переменной — выводится пустота.

Диагностика

echo $name    # посмотреть текущее значение
# (пусто)

# Проверить объявление:
name="Andrew"
echo $name
# Andrew