Heredoc в Bash: всё что нужно знать про EOF
Полная шпаргалка по конструкции << EOF в Linux. 12 практических примеров: создание конфигов, запись YAML-манифестов в Kubernetes, передача SQL-запросов и запуск скриптов внутри Docker. Без воды — только рабочие команды.
Команды
-
cat >> config.txt << 'EOF' # Добавили в конец location /api { proxy_pass http://api_backend; } EOFДописать в конец файла (не перезаписать!).
Разница: один > — перезаписать, два >> — дописать. -
cat > config.txt << 'EOF' server { listen 80; server_name clownix.ru; location / { proxy_pass http://backend; } } EOFСоздать файл с текстом (самый частый случай).
-
sudo tee /etc/nginx/conf.d/clownix.conf << 'EOF' server { listen 80; server_name clownix.ru; } EOFЗаписать файл от имени root.
Зачем: cat > файл работает только с правами, а tee умеет писать туда, куда cat не может. -
cat << 'EOF' | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: django-test spec: containers: - name: django image: python:3.11 EOFЗаписать YAML-манифест в Kubernetes.
Создаём под без файла на диске — сразу отправляем в кластер. -
mysql -u root -p << 'EOF' CREATE DATABASE clownix; CREATE USER 'django'@'localhost' IDENTIFIED BY 'secret'; GRANT ALL ON clownix.* TO 'django'@'localhost'; FLUSH PRIVILEGES; EOF
Передать многострочный SQL в базу.
-
cat > backup.py << 'EOF' #!/usr/bin/env python3 import shutil from datetime import datetime now = datetime.now().strftime("%Y%m%d") shutil.make_archive(f"/backups/db-{now}", 'gzip', '/var/lib/postgresql') print("Backup done!") EOF chmod +x backup.py python3 backup.pyСоздать bash-скрипт и сразу запустить.
-
cat > .env << 'EOF' DB_NAME=clownix DB_USER=django DB_PASS=SuperSecret123 DEBUG=False SECRET_KEY=django-insecure-xyz EOF
Создать .env файл с секретами.
-
python3 << 'EOF' import os print("Hello from Python!") print(f"User: {os.getenv('USER')}") EOFПередать текст в Python прямо в терминале.
-
docker run --rm python:3.11 python3 << 'EOF' print("Я запустился внутри контейнера!") import sys print(sys.version) EOFDocker: запустить контейнер с командой из EOF.
-
NAME="Clownix" # Без кавычек — переменная развернётся: cat << EOF Привет, $NAME! EOF # Вывод: Привет, Clownix! # С кавычками — останется как есть: cat << 'EOF' Привет, $NAME! EOF # Вывод: Привет, $NAME!
С раскрытием переменных (без кавычек).
-
if true; then cat <<- 'EOF' > script.sh #!/bin/bash echo "Отступы в виде табов будут убраны!" echo "Удобно для скриптов внутри скриптов" EOF fiС отступами в коде (<<-).
Обычный << EOF нельзя ставить с отступами (иначе они попадут в файл). Но есть лайфхак.
<<- — убирает ведущие табы (именно табы, не пробелы!) из каждой строки перед EOF. -
sudo tee /etc/systemd/system/backup.service > /dev/null << 'EOF' [Unit] Description=Nightly backup After=network.target [Service] Type=oneshot ExecStart=/opt/backup/run.sh User=backup [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now backup.service sudo systemctl status backup.service
Создать systemd-сервис и сразу его запустить.
Дополнительные блоки
команда << 'МАРКЕР' любой текст с переносами и "кавычками" 'всеми' $переменные не разворачиваются МАРКЕР