← Работа с файлами
Работа с файлами

Heredoc в Bash: всё что нужно знать про EOF

Heredoc в Bash: всё что нужно знать про EOF

Полная шпаргалка по конструкции << EOF в Linux. 12 практических примеров: создание конфигов, запись YAML-манифестов в Kubernetes, передача SQL-запросов и запуск скриптов внутри Docker. Без воды — только рабочие команды.

Команды

  1. cat >> config.txt << 'EOF'
    # Добавили в конец
    location /api {
        proxy_pass http://api_backend;
    }
    EOF

    Дописать в конец файла (не перезаписать!).
    Разница: один > — перезаписать, два >> — дописать.

  2. cat > config.txt << 'EOF'
    server {
        listen 80;
        server_name clownix.ru;
        location / {
            proxy_pass http://backend;
        }
    }
    EOF

    Создать файл с текстом (самый частый случай).

  3. sudo tee /etc/nginx/conf.d/clownix.conf << 'EOF'
    server {
        listen 80;
        server_name clownix.ru;
    }
    EOF

    Записать файл от имени root.
    Зачем: cat > файл работает только с правами, а tee умеет писать туда, куда cat не может.

  4. cat << 'EOF' | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: django-test
    spec:
      containers:
      - name: django
        image: python:3.11
    EOF

    Записать YAML-манифест в Kubernetes.
    Создаём под без файла на диске — сразу отправляем в кластер.

  5. 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 в базу.

  6. 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-скрипт и сразу запустить.

  7. cat > .env << 'EOF'
    DB_NAME=clownix
    DB_USER=django
    DB_PASS=SuperSecret123
    DEBUG=False
    SECRET_KEY=django-insecure-xyz
    EOF

    Создать .env файл с секретами.

  8. python3 << 'EOF'
    import os
    print("Hello from Python!")
    print(f"User: {os.getenv('USER')}")
    EOF

    Передать текст в Python прямо в терминале.

  9. docker run --rm python:3.11 python3 << 'EOF'
    print("Я запустился внутри контейнера!")
    import sys
    print(sys.version)
    EOF

    Docker: запустить контейнер с командой из EOF.

  10. NAME="Clownix"
    # Без кавычек — переменная развернётся:
    cat << EOF
    Привет, $NAME!
    EOF
    
    # Вывод: Привет, Clownix!
    
    # С кавычками — останется как есть:
    cat << 'EOF'
    Привет, $NAME!
    EOF
    
    # Вывод: Привет, $NAME!

    С раскрытием переменных (без кавычек).

  11. if true; then
            cat <<- 'EOF' > script.sh
    		#!/bin/bash
    		echo "Отступы в виде табов будут убраны!"
    		echo "Удобно для скриптов внутри скриптов"
            EOF
        fi

    С отступами в коде (<<-).
    Обычный << EOF нельзя ставить с отступами (иначе они попадут в файл). Но есть лайфхак.
    <<- — убирает ведущие табы (именно табы, не пробелы!) из каждой строки перед EOF.

  12. 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-сервис и сразу его запустить.

Дополнительные блоки

команда << 'МАРКЕР'
любой текст
с переносами
и "кавычками" 'всеми'
$переменные не разворачиваются
МАРКЕР