Как сделать скрипт исполняемым и запустить .sh
chmod +x script.sh
./script.shchmod +x даёт файлу право на выполнение, ./script.sh запускает его из текущей папки. Право выполнения видно в ls -l по букве x: -rwxr-xr-x. Ставить его нужно один раз — дальше оно сохраняется.
Только себе, без права для остальных:
chmod u+x script.shПочему ./ в начале
Команду без пути оболочка ищет только в папках из переменной PATH, а текущей папки там нет. Поэтому:
./script.sh— скрипт из текущей папки;/home/ivan/scripts/backup.shили~/scripts/backup.sh— скрипт по полному пути;script.shбез пути —command not found, если только скрипт не лежит в одной из папокPATH(как это настроить — в справке Как добавить папку в PATH).
Запуск без права на выполнение
Скрипт можно передать оболочке напрямую — chmod тогда не нужен:
bash script.shНо не путайте с sh script.sh: в Ubuntu и Debian sh — это другая, более простая оболочка dash. Скрипт, написанный для bash, в ней может сломаться с ошибками вроде Syntax error или [[: not found.
Право есть, а Permission denied
- Диск подключён с запретом запуска (
noexec). Так бывает с флешками, сетевыми папками и иногда с/tmp. Скопируйте скрипт в домашнюю папку или запускайте черезbash script.sh. Проверить, как подключён диск:findmnt -T script.sh— в столбце параметров будетnoexec. - Флешка или диск с NTFS или exFAT. Права Linux там не хранятся, и
chmodничего не меняет. Решение то же: копия в домашнюю папку илиbash script.sh. - Нет права на папку. Чтобы запустить файл, нужно право
xи на все папки по пути к нему.
Другие ошибки при запуске
bad interpreter: No such file or directoryв строке с/bin/bash^M— файл сохранён в Windows, и в конце строк лишние символы. Исправить:sed -i 's/\r$//' script.sh. Подробнее — в справке Ошибка No such file or directory.- Скрипт запускается, но ведёт себя странно — проверьте первую строку: она должна быть ровно
#!/bin/bash(или#!/usr/bin/env bash) и стоять самой первой, без пустой строки над ней.
Не давайте права на выполнение файлам, скачанным из непроверенных мест, и не запускайте их через sudo, не прочитав. Скрипт получает все ваши права, а с sudo — права администратора над всей системой.