Запуск скриптов

Тема дорожной карты · Bash

Bash-скрипт можно выполнить несколькими способами, каждый из которых имеет разные последствия для наследования окружения и области видимости. Запуск bash script.sh или ./script.sh (после chmod +x script.sh) запускает новый дочерний процесс Bash, поэтому переменные или функции, определённые внутри скрипта, не влияют на вызывающую оболочку. Подключение скрипта через . script.sh или source script.sh выполняет его команды внутри текущего процесса оболочки, что позволяет определять переменные окружения или функции, сохраняющиеся после завершения скрипта, — этот приём широко используется в скриптах настройки в рамках автоматизации Linux. Запуск скрипта через exec bash script.sh полностью заменяет текущий процесс, что полезно в точках входа контейнеров и сценариях инициализации, где необходима чистая подстановка процесса. Понимание этих режимов выполнения — дочерний процесс, подключение через source и exec — необходимо для написания корректных Bash-скриптов и избежания трудноуловимых ошибок окружения при автоматизации Linux.

Как это работает

Запуск скриптов — Bourne-Again SHell, дефолтный login shell на большинстве Linux-дистрибутивов. Это и интерактивный интерпретатор, и скриптовый язык. Скрипты начинаются с #!/usr/bin/env bash (или #!/bin/bash для явного пути). Shell парсит ввод в токены, делает расширения (параметры, command substitution, glob), исполняет команды, ловит exit-коды. Современные альтернативы (zsh, fish) хороши интерактивно, но bash остаётся lingua franca для скриптов.

Когда применять

Bash — для shell-автоматизации, которая должна работать на любом Linux/macOS-боксе (zsh+ не гарантирован). #!/usr/bin/env bash лучше #!/bin/sh, когда нужны bash-фичи (массивы, [[ ]], process substitution). Переходите на Python/Go, когда скрипт >~200 строк, нужны структурированные данные или надёжная обработка ошибок. Всегда set -euo pipefail + IFS=$'\n\t' в начале.

Типичные ошибки

Ловушки Запуск скриптов: путаница bash и sh (POSIX sh беднее — dash на Debian дефолтный /bin/sh); не обрабатывают ошибки (дефолт продолжает после сбоев); bash-скрипты с расчётом на GNU coreutils (sed -i "" vs sed -i) ломаются на macOS; алиасы внутри скриптов (фича интерактивного shell).

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…