В Linux файл не становится исполняемым автоматически — даже если это скрипт с правильным содержимым и расширением .sh. Исполняемость — отдельный атрибут, который задаётся явно. Без него система откажется запускать файл, даже если он синтаксически корректен.
Почему Linux не запускает файл без флага
В Windows исполняемость определяется расширением: .exe, .bat, .com. В Linux расширение не имеет значения. Вместо этого у каждого файла есть три отдельных флага прав для трёх категорий пользователей:
-rwxr-xr-- 1 user group 1024 Mar 02 12:00 script.sh
Три группы символов после -: права владельца (rwx), группы (r-x), остальных (r--). Буква x в каждой группе — это и есть флаг исполняемости. Если вместо неё стоит -, файл запустить нельзя.
Попытка запустить файл без флага даёт ошибку:
bash: ./script.sh: Permission denied
Или в некоторых оболочках:
The file './script' is not executable by this user
Команда chmod: синтаксис
Флагами управляет утилита chmod. Базовый синтаксис:
chmod [категория][действие][флаг] файл
Категории:
u— user, владелец файлаg— group, группаo— others, остальные пользователиa— all, все три категории сразу
Действия:
+— добавить право-— убрать право=— установить точно эти права (остальные убрать)
Флаги:
x— execute (выполнение)r— read (чтение)w— write (запись)
Дать право на выполнение
Только для владельца:
chmod u+x script.sh
Для всех — владельца, группы и остальных:
chmod a+x script.sh
Или то же самое короче:
chmod +x script.sh
Без указания категории chmod применяет a — ко всем. После этого файл можно запустить:
./script.sh

Проверить текущие права
Чтобы посмотреть флаги файла — команда ls -l:
ls -l script.sh
Вывод до установки флага:
-rw-rw-r-- 1 user user 45 Мар 02 15:33 script.sh
После chmod ugo+x script.sh:
-rwxrwxr-x 1 user user 45 Мар 02 15:33 script.sh
Буква x появилась в позициях владельца, группы и остальных. Звёздочка * после имени файла в некоторых терминалах — тоже признак исполняемого файла.

Числовой способ: восьмеричные права
Кроме символьной записи, chmod принимает числа в восьмеричной системе. Каждая цифра кодирует права одной категории:
| Цифра | Права | Расшифровка |
|---|---|---|
| 7 | rwx | чтение + запись + выполнение |
| 6 | rw- | чтение + запись |
| 5 | r-x | чтение + выполнение |
| 4 | r-- | только чтение |
| 0 | --- | нет прав |
Три цифры — права для владельца, группы и остальных.
Типичные сценарии:
# Владелец — полные права, остальные — только чтение и выполнение
chmod 755 script.sh
# Только владелец может всё, остальные не имеют никаких прав
chmod 700 script.sh
# Все могут всё (небезопасно для скриптов с паролями)
chmod 777 script.sh
755 — стандарт для исполняемых скриптов и программ. 700 — для скриптов с чувствительными данными (ключи, пароли).
Убрать флаг исполняемости
chmod -x script.sh
Или только для конкретной категории:
chmod o-x script.sh # убрать для остальных, у владельца и группы оставить
Рекурсивно для всех файлов в директории
Флаг -R применяет права ко всем файлам и вложенным папкам:
chmod -R +x /opt/myapp/
С рекурсией нужно быть осторожным — флаг x добавится и к обычным файлам данных, и к директориям. Для директорий x означает право входить в них, а не запускать — это другое. Более точный подход — использовать find:
# Только файлы .sh
find /opt/myapp -name "*.sh" -exec chmod +x {} \;
# Только обычные файлы (не директории)
find /opt/myapp -type f -exec chmod +x {} \;
GUI-способ: через файловый менеджер
Для тех, кто предпочитает графический интерфейс — флаг исполняемости можно установить через Nautilus (файловый менеджер GNOME) без терминала.
Кликнуть правой кнопкой по файлу → Свойства.

Перейти на вкладку Права. Поставить галочку «Разрешить выполнение файла как программы».

Это эквивалент команды chmod u+x — флаг добавляется только для владельца.
В других окружениях аналогичные опции находятся в том же месте: Thunar (Xfce) — вкладка «Права доступа», Dolphin (KDE) — вкладка «Права».
Частые ошибки
chmod: changing permissions of 'file': Operation not permitted Нет прав на изменение файла. Нужен sudo или смена владельца через chown.
Флаг добавлен, но скрипт всё равно не запускается Скорее всего, не указан интерпретатор. Добавить в первую строку скрипта shebang:
#!/bin/bash
Или для Python:
#!/usr/bin/env python3
Файл на FAT32/NTFS разделе — chmod не работает Файловые системы FAT32 и NTFS не поддерживают флаги Linux. Флаг нельзя ни установить, ни снять. Решение — скопировать файл на раздел с ext4/xfs/btrfs.
Шпаргалка
| Задача | Команда |
|---|---|
| Сделать исполняемым для всех | chmod +x file |
| Только для владельца | chmod u+x file |
| Числовой способ (стандарт) | chmod 755 file |
| Убрать флаг исполняемости | chmod -x file |
| Рекурсивно для всех .sh | find . -name "*.sh" -exec chmod +x {} \; |
| Проверить текущие права | ls -l file |
| Числовые права подробно | stat -c "%a %n" file |