umleitungen.txt https://forum-raspberrypi.de/forum/thread/47565-cron-anacron/ stdin, stdout, stderr - Kanäle der Bash Vorab noch ein wenig Hintergrundwissen : Allen Befehlen und Programmen, welche in der Bash gestartet werden, werden immer die drei folgenden Kanäle zugewiesen : den Standardeingabekanal stdin; dieser hat die Nummer 0 (null). Normalerweise liest stdin die Eingaben von der Tastatur, welche mit dem Terminal verbunden ist. den Standardausgabekanal stdout; dieser hat die Nummer 1 (eins). Normalerweise schreibt stdout die Ausgaben auf den Bildschirm, welcher mit dem Terminal verbunden ist. den Standardfehlerkanal stderr; dieser hat die Nummer 2 (zwei). Normalerweise schreibt stderr die Ausgaben auf den Bildschirm, welcher mit dem Terminal verbunden ist. Für einen Shell-Prozess inklusiver seiner Kindprozesse lässt sich die Ausgabe mittels : exec > datei.txt auch global umleiten. ----- *** https://wiki.ubuntuusers.de/Shell/Umleitungen/ Es ist aber auch möglich, die Ausgabe an existierende Dateien anzuhängen, in dem man statt ein > zwei >> verwendet. Der Befehl ls ~/Desktop >> verzeichnis.txt hängt den Inhalt von ~/Desktop also an die Datei verzeichnis.txt an. Neben stdout schreibt auch der Standardfehlerkanal stderr regelmäßig auf das Terminal. Möchte man die Ausgabe von stderr umleiten, muss man 2> statt > verwenden: ls -la /home/user 2> fehler.txt 2> heißt soviel wie „leite den Kanal 2 (stderr) um“. Hinweis: Der Kanal 1 (stdout) muss bei der Umleitung nicht explizit benannt werden. ">" wird von der Bash automatisch mit "1>" gleichgesetzt. Es lassen sich auch beide Kanäle gleichzeitig in zwei verschiedene Dateien umleiten: ls -la > verzeichnis.txt 2> fehler.txt So wird die Ausgabe von ls in die Datei verzeichnis.txt umgeleitet, Fehlermeldungen in die Datei fehler.txt. Weiterhin ist es auch möglich, beide Kanäle in eine Datei zu leiten: ls -la > gemeinsam.txt 2>&1 2>&1 bedeutet also soviel wie „schreibe die Ausgabe von Kanal 2 (stderr) dorthin, wo die Ausgabe von Kanal 1 (stdout) geschrieben wird“. Hinweis: Die Reihenfolge ist wichtig: Es wird immer dorthin umgeleitet, wohin der angegebene Kanal gerade geleitet wird. Stellt man das 2>&1 also vor das > gemeinsam.txt, wird stderr auf die Standardausgabe geleitet, nur was ursprünglich auf die Standardausgabe geschrieben wurde, landet in der Datei. Natürlich kann man auch bei Kanal 2 zwei größer-als-Zeichen verwenden. So lassen sich z.B. Fehlermeldungen während einer Datensicherung von Tar an eine Logdatei anhängen: echo "Sicherung" >> backup.log tar -cf sicherung.tgz "/home" 2>> backup.log Die Verwendung von &> leitet sowohl stdout als auch stderr in die angegebene Datei um. Das ist hilfreich u.a. in Bash-Skripten, in denen lediglich der Rückgabewert von Befehlen interessiert, nicht aber der Ausgabetext. Diese Funktionalität ist nicht verfügbar in der sh. Dieses Beispiel beendet ein Skript, wenn irgendeine Datei im Homeverzeichnis geöffnet ist und unterdrückt dabei jegliche Ausgaben: 1 2 3 if lsof ~ &>/dev/null; then exit 1; fi In Bash-Versionen 3.x und älter funktioniert die Umleitung mit &>> nicht, wobei alle aktuell unterstützen Ubuntu-Versionen alle Bash 4.x mitbringen. Abhilfe schafft das Anhängen von stdout an eine Datei anhängen und die Umleitung von stderr nach stdout. Dieses Beispiel führt ein Kommando aus und hängt sowohl stdout als auch stderr an ein logfile: ./my_command.sh >> results.log 2>&1 Für interaktive Shells empfiehlt es sich, die Shell-Option -C ("noclobber") zu setzen (z.B. in der ~/.bashrc), die das versehentliche Überschreiben von Dateien verhindert: $ cat datei welt $ set -C $ echo star > datei bash: datei: cannot overwrite existing file $ cat datei welt Muss man dann doch einmal eine Datei überschreiben, hilft >|: $ echo star >| datei $ cat datei star Für einen Shell-Prozess und alle Kindprozesse lässt sich die Ausgabe auch global umleiten. Mit exec > datei.txt sowie sämtlicher in diesem Abschnitt genannten Varianten wird die Ausgabe aller nachfolgenden Befehle in die Datei geschrieben. Eine explizite Umleitung ist dann in den Befehlen nicht mehr erforderlich. Dies kann auch dazu genutzt werden, selektiv in eine Datei auszugeben, die nicht immer wieder geöffnet werden muss: exec 9> arbeit.log echo 'Wir zeigen das aktuelle Verzeichnis auf der Konsole an.' >&9 ls echo 'Wir sind fertig mit dem Zeigen das aktuellen Verzeichnisses.' >&9 Dieses Vorgehen spart Zeit für das Öffnen der Datei, hat aber vor allem den Vorteil, dass alle Ausgaben garantiert in der selben Datei landen. (Andernfalls wenn beim Arbeiten mit >> die Datei umbenannt wird, gelangen die Ausgaben in verschiedene Dateien.) Experten-Info: Normalerweise müssen Kanäle nicht geschlossen werden, da der Kernel das beim Beenden eines Prozesses automatisch tut. Sollte es in seltenen Fällen doch nötig sein, kann man das durch die Umleitung von oder auf &- erreichen. Damit wird der umgeleitete Kanal geschlossen. Im obigen Beispiel mit exec würde Kanal 9 mit exec 9>&- geschlossen werden. see there