Ошибка 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 file даёт права на чтение, запись и исполнение всем пользователям системы — включая посторонних. Никогда не применяйте к конфигурационным файлам, SSH-ключам, базам данных.Для SSH-ключа:
chmod 600 ~/.ssh/id_rsaДля скрипта (исполняемый только для вас):
chmod 700 script.shДля публичного скрипта:
chmod 755 script.sh
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