In Bash-Skripten und auf der Kommandozeile gehört das Schreiben von Text in Dateien zu den grundlegenden Aufgaben. Dafür stehen dir mehrere Methoden zur Verfügung: Umleitungsoperatoren, Here-Documents und der Befehl tee.

Grundlagen der Umleitung

Die Standardausgabe eines Befehls lässt sich mit Umleitungsoperatoren in eine Datei schreiben. Die allgemeine Syntax:

befehl > datei
befehl >> datei
  • > schreibt die Ausgabe in eine Datei. Falls die Datei existiert, wird sie überschrieben. Falls nicht, wird sie erstellt.
  • >> hängt die Ausgabe an das Ende einer bestehenden Datei an. Falls die Datei nicht existiert, wird sie erstellt.

Für beide Operatoren benötigst du Schreibrechte auf die Zieldatei. Andernfalls erscheint die Meldung „Permission denied".

Text mit echo und printf schreiben

Der einfachste Weg, Text in eine Datei zu schreiben, führt über echo:

echo "Erste Zeile" > ausgabe.txt

Diese Zeile erstellt die Datei ausgabe.txt mit dem Inhalt „Erste Zeile". Um weitere Zeilen hinzuzufügen, verwendest du >>:

echo "Zweite Zeile" >> ausgabe.txt
echo "Dritte Zeile" >> ausgabe.txt

Für formatierte Ausgaben eignet sich printf:

printf "Benutzer: %s\nDatum: %s\n" "$USER" "$(date +%Y-%m-%d)" > info.txt

Schutz vor versehentlichem Überschreiben

Der >-Operator überschreibt Dateien ohne Warnung. Um das zu verhindern, aktivierst du die Option noclobber:

set -o noclobber

Mit aktiviertem noclobber schlägt der Versuch fehl, eine bestehende Datei zu überschreiben:

echo "Test" > vorhandene-datei.txt

Die Shell gibt dann aus: bash: vorhandene-datei.txt: kann bestehende Datei nicht überschreiben

Falls du trotz aktiviertem noclobber eine Datei überschreiben willst, verwendest du >|:

echo "Überschreiben erzwingen" >| vorhandene-datei.txt

Mehrere Zeilen mit Here-Documents

Für längere Textblöcke sind Here-Documents praktischer als mehrere echo-Aufrufe. Die Syntax beginnt mit << gefolgt von einem frei wählbaren Begrenzer (oft EOF):

cat << EOF > config.txt
# Konfigurationsdatei
server=localhost
port=8080
debug=false
EOF

Variablen und Befehlssubstitutionen werden innerhalb des Here-Documents ausgewertet:

cat << EOF > status.txt
Arbeitsverzeichnis: $PWD
Angemeldet als: $(whoami)
Zeitstempel: $(date)
EOF

Um die Variablenersetzung zu deaktivieren, setzt du den Begrenzer in einfache Anführungszeichen:

cat << 'EOF' > script-vorlage.txt
echo "Der Benutzer ist: $USER"
echo "Das Verzeichnis ist: $PWD"
EOF

In diesem Fall bleibt $USER und $PWD als Text erhalten und wird nicht durch Werte ersetzt.

Der tee-Befehl

Der Befehl tee liest von der Standardeingabe und schreibt gleichzeitig in eine Datei und auf die Standardausgabe. Das ist nützlich, wenn du die Ausgabe sehen und speichern willst:

echo "Protokolleintrag" | tee protokoll.txt

Die Ausgabe erscheint im Terminal und wird in protokoll.txt gespeichert.

An Datei anhängen

Standardmäßig überschreibt tee die Zieldatei. Mit der Option -a hängst du stattdessen an:

echo "Neuer Eintrag" | tee -a protokoll.txt

Ausgabe unterdrücken

Falls du die Terminalausgabe nicht benötigst, leitest du sie nach /dev/null um:

echo "Nur in Datei" | tee datei.txt > /dev/null

In mehrere Dateien gleichzeitig schreiben

tee akzeptiert mehrere Dateinamen als Argumente:

echo "Backup-Eintrag" | tee backup1.txt backup2.txt backup3.txt

Mit Root-Rechten schreiben

Ein wichtiger Vorteil von tee: In Kombination mit sudo kannst du in Dateien schreiben, für die du normalerweise keine Berechtigung hast:

echo "neue-zeile" | sudo tee -a /etc/hosts > /dev/null

Das funktioniert, weil sudo vor tee steht und nicht vor echo. Der >-Operator würde hier nicht funktionieren, da die Umleitung von der Shell ausgeführt wird, bevor sudo greift.

Befehlsausgaben in Dateien speichern

Jede Befehlsausgabe lässt sich in eine Datei umleiten. Beispiele:

# Datum und Uhrzeit speichern
date > zeitstempel.txt

# Verzeichnisinhalt auflisten
ls -la /var/log > verzeichnisliste.txt

# Systeminformationen sammeln
uname -a > systeminfo.txt
hostname >> systeminfo.txt

Zusammenfassung

Zum Schreiben in Dateien auf der Kommandozeile stehen dir mehrere Werkzeuge zur Verfügung:

  • > überschreibt eine Datei, >> hängt an
  • Here-Documents (<< EOF) eignen sich für mehrzeilige Inhalte
  • tee schreibt gleichzeitig in Datei und Terminal
  • Mit sudo tee schreibst du in Dateien, die Root-Rechte erfordern