Eine Lösung, um viele Befehle auf einmal umzuleiten:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Warum Ihre ursprüngliche Lösung nicht funktioniert: exec 2> & 1 leitet die Standardfehlerausgabe an die Standardausgabe Ihrer Shell weiter, die, wenn Sie Ihr Skript von der Konsole aus ausführen, Ihre Konsole ist. Die Pipe-Umleitung bei Befehlen leitet nur die Standardausgabe des Befehls um.
Unter dem Gesichtspunkt von somecommand
wird die Standardausgabe in eine Pipe geschrieben, die mit verbunden ist, tee
und der Standardfehler wird in dieselbe Datei / Pseudodatei geschrieben wie der Standardfehler der Shell, die Sie zur Standardausgabe der Shell umleiten Konsole, wenn Sie Ihr Programm von der Konsole aus ausführen.
Der einzig wahre Weg, dies zu erklären, ist zu sehen, was wirklich passiert:
Die ursprüngliche Umgebung Ihrer Shell könnte folgendermaßen aussehen, wenn Sie sie vom Terminal aus ausführen:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Nachdem Sie den Standardfehler in die Standardausgabe ( exec 2>&1
) umgeleitet haben , ... ändern Sie im Grunde nichts. Wenn Sie jedoch die Standardausgabe des Skripts in eine Datei umleiten, erhalten Sie eine Umgebung wie die folgende:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Das Umleiten des Shell-Standardfehlers in die Standardausgabe würde dann folgendermaßen enden:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
Das Ausführen eines Befehls erbt diese Umgebung. Wenn Sie einen Befehl ausführen und ihn an tee weiterleiten, sieht die Umgebung des Befehls folgendermaßen aus:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Der Standardfehler Ihres Befehls geht also immer noch in das ein, was die Shell als Standardfehler verwendet.
Sie können die Umgebung eines Befehls tatsächlich anzeigen, indem Sie nachsehen /proc/[pid]/fd
: Verwenden Sie ls -l
diese Option, um auch den Inhalt des symbolischen Links aufzulisten. Die 0
Datei hier ist Standardeingabe, 1
Standardausgabe und 2
Standardfehler. Wenn der Befehl mehr Dateien öffnet (und die meisten Programme dies tun), werden sie auch angezeigt. Ein Programm kann auch wählen , um ihre Standard - Ein- / Ausgabe und Wiederverwendung zu umleiten oder zu schließen 0
, 1
und 2
.
|&
die als Abkürzung für funktionieren2>&1 |
, ist es zumindest etwas praktischer.