
Файл с расширением .sh используется в Linux для автоматизации задач через командную оболочку. Такой файл представляет собой обычный текстовый документ, содержащий последовательность команд, которые система выполняет построчно. Практическая ценность sh-скриптов проявляется при работе с резервным копированием, установкой пакетов, управлением сервисами и обработкой файлов без ручного ввода одних и тех же команд.
Для корректной работы sh файла необходимо учитывать несколько технических деталей: указание интерпретатора через shebang, корректную кодировку, права доступа и способ запуска. Ошибка на любом из этих этапов приводит к сообщениям вида permission denied или command not found, что часто вызывает сложности у пользователей, только начинающих работать с терминалом.
Создание sh файла не требует дополнительных программ – достаточно стандартных утилит, присутствующих в любой дистрибуции Linux. Используются команды touch, nano или vim, а также chmod для назначения прав. Понимание порядка действий позволяет быстро создавать рабочие скрипты, адаптированные под конкретные задачи и окружение.
Пошаговый подход к созданию sh файла помогает избежать типичных ошибок и сразу получить исполняемый инструмент, готовый к использованию в терминале или внутри других скриптов. Такой навык полезен как для системного администрирования, так и для повседневной работы в Linux.
Выбор каталога и имени для sh файла

Место размещения sh файла напрямую влияет на удобство его запуска и сопровождения. Для пользовательских скриптов оптимально использовать каталог ~/bin, так как он часто уже добавлен в переменную окружения PATH. Если каталога нет, его создают вручную, что позволяет запускать скрипт по имени без указания полного пути.
Для задач администрирования и автоматизации на уровне системы скрипты размещают в /usr/local/bin или /opt. Эти каталоги предназначены для пользовательских утилит и не затрагиваются пакетным менеджером. Размещение sh файла в /tmp допустимо только для временных сценариев, так как содержимое этого каталога может очищаться при перезагрузке.
Имя sh файла должно отражать выполняемое действие и не содержать пробелов. Используются строчные латинские буквы, цифры и символ подчеркивания. Пример корректного имени: backup_home.sh. Наличие расширения .sh не обязательно для запуска, но упрощает визуальную идентификацию файла среди других исполняемых скриптов.
Перед созданием файла полезно проверить, не занято ли выбранное имя существующей командой. Это делается через which или type. Совпадение имени скрипта с системной утилитой может привести к неожиданному поведению при выполнении команд в терминале.
Создание файла через терминал с помощью touch и nano

Создание sh файла начинается с перехода в нужный каталог командой cd. После этого используется touch script.sh, которая создает пустой файл без содержимого. Этот способ удобен, когда требуется заранее подготовить структуру файлов или задать имя до редактирования.
Для добавления команд файл открывают в текстовом редакторе nano с помощью команды nano script.sh. Редактор запускается прямо в терминале и не требует дополнительной настройки. В верхней части окна отображается имя файла, а в нижней – подсказки по сочетаниям клавиш для управления.
При вводе команд важно соблюдать точный синтаксис оболочки. Каждая команда записывается с новой строки, без лишних символов. Комментарии добавляются через символ #, что позволяет пояснять логику скрипта и упрощает его поддержку.
После завершения редактирования файл сохраняется сочетанием клавиш Ctrl+O с подтверждением имени, затем редактор закрывается через Ctrl+X. Проверка содержимого выполняется командой cat script.sh или повторным открытием в nano.
Добавление shebang для указания интерпретатора bash
Для скриптов, ориентированных на bash, shebang добавляется строго в первую строку файла, без пробелов перед символами. Наиболее распространённый вариант – указание абсолютного пути к интерпретатору. Проверить путь можно командой which bash.
В некоторых системах используется универсальный подход через /usr/bin/env, который ищет bash в переменной PATH. Это повышает переносимость скрипта между разными дистрибутивами Linux, где путь к bash может отличаться.
| Shebang | Назначение |
|---|---|
| #!/bin/bash | Прямое указание интерпретатора bash по стандартному пути |
| #!/usr/bin/env bash | Запуск bash через переменную PATH |
После добавления shebang файл следует сохранить и убедиться, что строка не содержит скрытых символов или кодировки Windows. Проверка выполняется командой head -n 1 script.sh, которая должна вывести только строку с указанием интерпретатора.
Запись команд и базовой логики скрипта

После строки shebang в sh файле последовательно записываются команды, которые обычно выполняются вручную в терминале. Каждая команда располагается на отдельной строке и исполняется в том же порядке. Например, сначала можно задать переменные, затем выполнить операции с файлами или вызвать системные утилиты.
Для хранения данных используются переменные без указания типа. Присваивание выполняется без пробелов: DIR=/home/user/data. Обращение к переменной происходит через символ $, что позволяет подставлять значения в командах и путях.
Базовая логика реализуется с помощью условных конструкций if, циклов for и while. Условие всегда заключается в квадратные скобки с обязательными пробелами по краям. Нарушение этого правила приводит к ошибкам выполнения, которые сложно диагностировать без внимательной проверки синтаксиса.
Комментарии начинаются с символа # и игнорируются интерпретатором. Их используют для пояснения назначения блоков кода, входных параметров и ожидаемого результата. Грамотно расставленные комментарии упрощают чтение и доработку скрипта спустя длительное время.
Сохранение файла и проверка его содержимого

После завершения редактирования sh файла важно корректно сохранить изменения. В редакторе nano это выполняется сочетанием клавиш Ctrl+O с подтверждением имени файла и нажатием Enter. Несохранённые изменения будут утеряны при выходе из редактора, поэтому перед закрытием следует убедиться, что операция записи прошла без ошибок.
Отдельное внимание уделяется первой строке с указанием интерпретатора и отсутствию лишних символов в начале файла. Проверить это можно командой head -n 1 script.sh. Если shebang расположен не в первой строке или содержит пробелы перед #!, скрипт не будет корректно обрабатываться оболочкой.
Для диагностики синтаксических ошибок применяется проверка без выполнения команд. Команда bash -n script.sh анализирует файл и сообщает о проблемах в конструкции условий, циклов и кавычек. Такой подход позволяет устранить ошибки до назначения прав на выполнение.
Назначение прав на выполнение командой chmod

По умолчанию созданный sh файл не имеет права на выполнение, поэтому его нельзя запустить как программу. Для изменения прав используется команда chmod, которая управляет доступом на уровне файловой системы Linux.
Наиболее распространённый способ – добавление права выполнения для владельца файла:
- chmod u+x script.sh – разрешает запуск только владельцу
- chmod +x script.sh – разрешает запуск всем категориям пользователей
Перед изменением прав полезно проверить текущее состояние доступа. Это делается командой ls -l script.sh, где символ x указывает на наличие права выполнения. Отсутствие этого символа означает, что файл может быть только прочитан или изменён.
Для более точного контроля применяются числовые значения прав. Они задают доступ отдельно для владельца, группы и остальных пользователей:
- chmod 700 script.sh – выполнение доступно только владельцу
- chmod 755 script.sh – выполнение разрешено всем, изменение только владельцу
Назначая права, следует учитывать место размещения скрипта и круг пользователей. Избыточные разрешения в системных каталогах увеличивают риск случайного запуска или изменения файла другими пользователями.
Запуск sh файла и устранение типовых ошибок

Запуск sh файла возможен несколькими способами, выбор зависит от расположения файла и настроек окружения. Если файл находится в текущем каталоге и имеет право на выполнение, используется явное указание пути ./script.sh. При размещении в каталоге, добавленном в PATH, достаточно ввести имя файла без префиксов.
Альтернативный вариант – запуск через интерпретатор, что не требует установки права выполнения:
- bash script.sh – выполнение через bash
- sh script.sh – запуск через оболочку по умолчанию
- Permission denied – отсутствует право выполнения или файл расположен на разделе с запретом запуска
- No such file or directory – указан неверный путь или имя файла
- Command not found – ошибка в названии команды или переменной PATH
- Syntax error – нарушение структуры условий, циклов или кавычек
- bash -x script.sh
Если скрипт был создан или отредактирован в среде Windows, возможны ошибки из-за символов конца строки. Проверка выполняется утилитой file, а исправление – командой dos2unix, после чего скрипт корректно обрабатывается оболочкой Linux.
Вопрос-ответ:
Почему скрипт не запускается командой ./script.sh, хотя файл существует?
Чаще всего причина связана с отсутствием права на выполнение. Это проверяется через ls -l script.sh: если в правах нет символа x, запуск будет запрещён. Решение — выполнить chmod +x script.sh. Также стоит убедиться, что команда запускается из того каталога, где находится файл, либо используется корректный путь. Дополнительно проблема возникает, если файл расположен на разделе с опцией noexec.
Обязательно ли указывать расширение .sh для bash-скрипта?
Расширение .sh не требуется для выполнения скрипта, система ориентируется на shebang и права доступа. Файл можно назвать без расширения и запускать как обычную команду. Расширение используют для наглядности и удобства работы с большим количеством файлов, особенно при просмотре каталогов и редактировании.
Чем отличается запуск через bash script.sh от ./script.sh?
При запуске через bash интерпретатор указывается явно, поэтому право на выполнение не требуется и shebang может отсутствовать. При использовании ./script.sh система читает первую строку файла и выбирает интерпретатор на основе shebang, а также проверяет права доступа. Второй способ ближе к поведению системных команд.
Почему скрипт выдаёт ошибки синтаксиса, хотя команды работают в терминале?
Такая ситуация часто возникает из-за различий между оболочками. Например, sh и bash по-разному обрабатывают некоторые конструкции. Если скрипт запускается через sh, а написан под bash, появляются ошибки. Решение — указать корректный shebang и запускать файл через bash. Также стоит проверить пробелы в условиях if и наличие закрывающих конструкций.
