Розуміння Shebangs: Виконання Bash та Python скриптів у Linux терміналі
Якщо ви коли-небудь писали shell або Python скрипт на Linux і цікавилися, як система знає, який інтерпретатор використовувати — відповідь криється в крихітній, але потужній двосимвольній послідовності на початку вашого файлу: shebang (#!).
Незалежно від того, чи ви автоматизуєте завдання обслуговування сервера, керуєте розгортаннями у середовищі VPS Hosting, чи пишете утиліти для вашого веб-сервера, розуміння того, як працюють shebangs, є фундаментальною навичкою Linux, яку повинен опанувати кожен системний адміністратор та розробник.
Цей посібник охоплює все, що вам потрібно знати: що таке shebangs, як їх використовувати в Bash та Python скриптах, і найкращі практики, які відрізняють аматорські скрипти від готової до виробництва автоматизації.
Що таке Shebang (#!)?
Shebang (також написаний як *sha-bang*, *hashbang* або *pound-bang*) — це спеціальна послідовність символів, розміщена на самому першому рядку файлу скрипту. Вона повідомляє ядру Linux, який інтерпретатор слід використовувати для виконання решти файлу.
Синтаксис простий:
#!/path/to/interpreterКоли ви запускаєте скрипт, операційна система читає перші два байти файлу. Якщо вона знаходить #!, вона передає файл інтерпретатору, вказаному на цьому рядку. Без shebang оболонка може спробувати виконати скрипт, використовуючи свій власний вбудований інтерпретатор — що може привести до неочікуваної поведінки або повного відмови, особливо при змішуванні мов.
Поширені приклади Shebang
| Тип скрипту | Рядок Shebang |
|---|---|
| Bash | #!/bin/bash |
| POSIX Shell | #!/bin/sh |
| Python 3 | #!/usr/bin/env python3 |
| Python 2 (застарілий) | #!/usr/bin/env python2 |
| Perl | #!/usr/bin/perl |
| Ruby | #!/usr/bin/env ruby |
| Node.js | #!/usr/bin/env node |
Чому /usr/bin/env важливий
Ви часто бачитимете shebangs, написані двома різними стилями:
#!/bin/python3проти:
#!/usr/bin/env python3Другий варіант майже завжди кращий. Ось чому:
- Портативність: Розташування
python3може відрізнятися в різних дистрибутивах Linux, macOS та системах BSD./usr/bin/envшукає у$PATHкористувача, щоб знайти правильний інтерпретатор, незалежно від того, де він встановлений. - Віртуальні середовища: При використанні віртуальних середовищ Python (
venv),/usr/bin/env python3правильно розпізнає бінарний файл Python віртуального середовища замість системного. - Майбутня сумісність: Якщо інтерпретатор оновлено або переміщено, скрипти, які використовують
env, продовжують працювати без змін.
Єдиний випадок, коли ви повинні використовувати жорстко закодований абсолютний шлях (наприклад, #!/bin/bash), — це коли вам потрібно гарантувати використання конкретного бінарного файлу — наприклад, у скриптах, чутливих до безпеки, де маніпуляція $PATH може бути ризиком.
Використання Shebangs у Bash скриптах: крок за кроком
Давайте пройдемо через створення повного, виконуваного Bash скрипту з нуля.
Крок 1: Відкрийте термінал
Отримайте доступ до вашого терміналу безпосередньо або підключіться через SSH до вашого Linux сервера.
Крок 2: Створіть новий файл Bash скрипту
Використовуйте текстовий редактор, такий як nano, щоб створити новий файл:
nano myscript.shКрок 3: Додайте Shebang та вміст скрипту
На самому початку файлу додайте рядок shebang, за яким слідує логіка вашого скрипту:
#!/bin/bash
# A simple greeting script
echo "Hello, World!"
echo "Current date and time: $(date)"
echo "Running as user: $(whoami)"Крок 4: Збережіть та вийдіть
У nano натисніть CTRL + X, потім Y, потім Enter для збереження та закриття файлу.
Крок 5: Зробіть скрипт виконуваним
За замовчуванням новостворені файли не є виконуваними. Надайте дозвіл на виконання за допомогою chmod:
chmod +x myscript.shВи можете перевірити зміну дозволу за допомогою:
ls -l myscript.shВи повинні побачити результат, подібний до:
-rwxr-xr-x 1 user user 112 Jun 10 14:32 myscript.shКрок 6: Запустіть скрипт
Виконайте скрипт безпосередньо з терміналу:
./myscript.shОчікуваний результат:
Hello, World!
Current date and time: Tue Jun 10 14:32:01 UTC 2025
Running as user: youruser> Примітка: Префікс ./ повідомляє оболонці шукати скрипт у поточному каталозі. Якщо каталог ваших скриптів додано до $PATH, ви можете запускати скрипти за назвою.
Використання Shebangs у Python скриптах: крок за кроком
Python скрипти слідують тій же схемі з однією ключовою відмінністю в рекомендованому рядку shebang.
Крок 1: Створіть новий файл Python скрипту
nano myscript.pyКрок 2: Додайте Shebang та Python код
#!/usr/bin/env python3
# A simple Python script demonstrating shebang usage
import sys
import platform
print("Hello from Python!")
print(f"Python version: {sys.version}")
print(f"Platform: {platform.system()} {platform.release()}")Крок 3: Збережіть, вийдіть та зробіть виконуваним
# Save and exit nano with CTRL+X, Y, Enter
chmod +x myscript.pyКрок 4: Запустіть скрипт
./myscript.pyОчікуваний результат:
Hello from Python!
Python version: 3.11.2 (main, Mar 13 2023, 12:18:29)
Platform: Linux 5.15.0-76-genericЗверніть увагу, що вам не потрібно префіксувати команду python3 — shebang автоматично обробляє вибір інтерпретатора.
Практичні приклади з реального світу
Розуміння shebang в ізоляції корисно, але його застосування до реальних адміністративних завдань робить його цінність очевидною.
Bash: Скрипт автоматизованого резервного копіювання
#!/bin/bash
# Automated backup script for web files
BACKUP_DIR="/var/backups/webfiles"
SOURCE_DIR="/var/www/html"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_FILE" "$SOURCE_DIR"
echo "Backup completed: $BACKUP_FILE"Python: Скрипт перевірки стану системи
#!/usr/bin/env python3
import shutil
import psutil
def check_disk_usage(path="/"):
total, used, free = shutil.disk_usage(path)
percent_used = (used / total) * 100
print(f"Disk Usage ({path}): {percent_used:.1f}% used")
if percent_used > 85:
print("WARNING: Disk usage is critically high!")
def check_memory():
mem = psutil.virtual_memory()
print(f"Memory Usage: {mem.percent}% used")
check_disk_usage()
check_memory()Ці типи скриптів неоцінні при управлінні інфраструктурою — незалежно від того, чи ви керуєте одним обліковим записом Shared Web Hosting чи організовуєте робочі навантаження на Dedicated Servers.
Поведінка Shebang: що відбувається під капотом
Коли ви виконуєте скрипт з shebang, ядро Linux виконує наступні кроки:
- Читає перший рядок файлу та ідентифікує послідовність
#!. - Аналізує шлях інтерпретатора (та будь-які необов’язкові аргументи) з рядка shebang.
- Викликає інтерпретатор, передаючи файл скрипту як аргумент.
Наприклад, запуск ./myscript.py внутрішньо еквівалентний:
/usr/bin/env python3 ./myscript.pyОсь чому shebang повинен завжди бути на першому рядку без попереднього пропуску — навіть один порожній рядок перед ним призведе до того, що shebang буде ігнорований.
Що відбувається без Shebang?
Якщо shebang відсутній, поведінка залежить від того, як викликається скрипт:
- Якщо запустити як
./script.py, поточна оболонка (наприклад, Bash) намагається його інтерпретувати, що не вдасться для Python коду. - Якщо запустити як
python3 script.py, shebang не має значення — Python явно вказаний. - Якщо запустити як
bash script.sh, знову shebang обходиться.
Shebang має значення лише коли скрипт виконується безпосередньо (тобто як ./script).
Розширені техніки Shebang
Передача аргументів інтерпретатору
Ви можете передати прапори інтерпретатору через рядок shebang:
#!/bin/bash -eПрапор -e змушує Bash вийти негайно, якщо будь-яка команда не вдасться — поширена практика безпеки для виробничих скриптів.
#!/usr/bin/env python3 -uПрапор -u змушує небуферизований вивід у Python, корисно для логування в реальному часі.
> Обережність: Деякі системи підтримують лише один аргумент після шляху інтерпретатора в рядку shebang. Для складної передачі аргументів краще встановити параметри в самому скрипті (наприклад, set -euo pipefail у Bash).
Використання env з конкретними версіями
#!/usr/bin/env python3.11Це спрямовує на конкретну версію Python, корисно в середовищах, де співіснують кілька версій.
Поліглотні скрипти
У деяких розширених випадках розробники пишуть скрипти, які одночасно є дійсними в кількох мовах. Shebang дозволяє це, контролюючи, який інтерпретатор запускається першим. Хоча це нішева техніка, вона демонструє гнучкість, яку забезпечує shebang.
Найкращі практики для написання рядків Shebang
Дотримання цих найкращих практик зробить ваші скрипти більш надійними, портативними та придатними для обслуговування — особливо важливо у виробничих середовищах серверів.
1. Завжди використовуйте правильний інтерпретатор
Узгодьте shebang з мовою та версією, які потребує ваш скрипт:
#!/bin/bash # For Bash-specific syntax
#!/bin/sh # For POSIX-compliant shell scripts (more portable)
#!/usr/bin/env python3 # For Python 3 scriptsНіколи не припускайте, що /bin/sh та /bin/bash взаємозамінні — вони не є. Bash підтримує функції (масиви, [[ ]], підстановку процесів), які POSIX sh не підтримує.
2. Надавайте перевагу /usr/bin/env для портативності
Як обговорювалося раніше, використання env робить скрипти портативними в різних системах та віртуальних середовищах Python. Використовуйте жорстко закодовані шляхи лише коли безпека або специфічність цього вимагають.
3. Завжди встановлюйте дозволи на виконання
Скрипти без дозволів на виконання не вдадуться з помилкою “Permission denied”:
chmod +x script.sh
chmod +x script.pyДля скриптів, призначених для всіх користувачів у системі:
chmod 755 script.sh4. Організуйте скрипти у спеціальному каталозі
Створіть каталог ~/scripts або ~/bin для особистих скриптів та додайте його до $PATH:
mkdir -p ~/bin
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrcПісля цього будь-який виконуваний скрипт, розміщений у ~/bin, можна запустити за назвою звідкись.
5. Додайте змістовні коментарі
Документуйте ваші скрипти коментарями, що пояснюють їх призначення, використання та будь-які залежності:
#!/bin/bash
# Script: backup_web.sh
# Purpose: Creates timestamped backups of web root
# Usage: ./backup_web.sh
# Dependencies: tar, gzip
# Author: Your Name
# Last Modified: 2025-06-106. Використовуйте параметри set для безпечніших Bash скриптів
Для виробничих Bash скриптів додайте ці параметри безпеки одразу після shebang:
#!/bin/bash
set -euo pipefail-e: Вихід при помилці-u: Розглядайте невстановлені змінні як помилки-o pipefail: Перехопіть помилки в конвеєрних командах
7. Протестуйте скрипти перед розгортанням у виробництво
Завжди тестуйте скрипти в середовищі розробки або проміжного розгортання перед запуском їх на виробничих серверах. Якщо вам потрібне ізольоване середовище для тестування,
