Heredoc și here-string în Linux / Bash

Scripting Bash POSIX (heredoc) / Bash 2.05b (here-string)

Trimite un bloc de text pe mai multe rânduri la intrarea unei comenzi, de exemplu pentru a crea fișiere de configurare.

Sintaxă comandă
comanda <<EOF
text pe mai multe rânduri
EOF
comanda <<< "text"

Ce face Heredoc și here-string

Un here document (heredoc) furnizează textul dintre <<EOF și rândul care conține doar EOF ca intrare standard pentru comandă. Cuvântul de final poate fi oricare (EOF, END, SQL), dar trebuie să fie singur pe rând, fără spații înainte sau după.

Fără ghilimele (<<EOF), Bash înlocuiește în text variabilele și rezultatul comenzilor $(...). Cu ghilimele (<<'EOF'), textul rămâne exact cum este scris, util pentru scripturi sau șabloane care conțin $.

Varianta <<-EOF elimină tab-urile (nu spațiile) de la începutul rândurilor, ca blocul să poată fi indentat în cod. Here-string-ul <<< "text" trimite un singur șir, fără fișier temporar sau echo |.

Opțiuni și argumente

Opțiune / Parametru Descriere
<<EOF Heredoc cu expansiune de variabile și comenzi.
<<'EOF' Heredoc literal: $VAR și $(cmd) rămân neschimbate.
<<-EOF Elimină tab-urile de la începutul rândurilor (inclusiv dinaintea lui EOF).
cat > fișier <<EOF Scrie blocul într-un fișier (îl suprascrie); cu >> adaugă la final.
<<< "text" Here-string: un singur șir trimis la intrarea comenzii, urmat de un rând nou.

Exemple

Exemplul 1: Crearea unui fișier de configurare

Variabilele din bloc sunt înlocuite cu valorile lor în momentul scrierii.

APLICATIE="magazin"
PORT=8080
cat > config.ini <<EOF
[server]
nume = $APLICATIE
port = $PORT
oras = Iași
EOF
cat config.ini

Rezultat

[server]
nume = magazin
port = 8080
oras = Iași

Exemplul 2: Heredoc literal pentru un script generat

Cu 'EOF', textul $1 ajunge neschimbat în fișier și este evaluat abia când rulează noul script.

cat > salut.sh <<'EOF'
echo "Salut, $1!"
EOF
cat salut.sh
bash salut.sh Ana

Rezultat

echo "Salut, $1!"
Salut, Ana!

Exemplul 3: Here-string pentru comenzi care citesc de la intrare

read împarte șirul în cuvinte, iar tr îl transformă fără un echo separat.

read -r prenume nume <<< "Ana Popescu"
echo "Prenume: $prenume, nume: $nume"
tr 'a-z' 'A-Z' <<< "dexblog"

Rezultat

Prenume: Ana, nume: Popescu
DEXBLOG

Greșeli frecvente

  • Spații sau indentare înaintea cuvântului de final: EOF nu închide heredoc-ul, iar Bash afișează un avertisment că a ajuns la sfârșitul fișierului.
  • Folosirea lui <<- cu spații în loc de tab-uri: sunt eliminate doar tab-urile, deci indentarea cu spații rămâne în text.
  • Uitarea ghilimelelor în <<'EOF' când textul conține $: variabilele inexistente devin șiruri goale și conținutul se strică.

Comenzi înrudite

  • Redirecționare și conducte (Pipes): Redirecționarea fluxurilor standard de intrare (stdin), ieșire (stdout), erori (stderr) și legarea prin conducte (pipes).
  • cat: Afișează conținutul unuia sau mai multor fișiere și le concatenează în ieșirea standard.
  • read: Citește o linie de text de la tastatură sau din intrarea standard și o salvează într-o variabilă.