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 teeschreibt gleichzeitig in Datei und Terminal- Mit
sudo teeschreibst du in Dateien, die Root-Rechte erfordern