
Ich habe also ein Programm, nennen wir es foo. Ich versuche, seine Terminalausgabe mit dem folgenden Befehl in eine Datei umzuleiten.
foo > ./someFile.txt
Wenn ich diesen Befehl jetzt ausführe, wird someFile.txt erstellt, es ist jedoch leer. Irgendwelche Vorschläge, wie ich die Terminalausgabe umleiten könnte?
Antwort1
Es ist das erwartete Verhalten, dass eine Datei someFile.txt
erstellt wird. Ob diese Datei etwas enthält oder nicht, hängt davon ab, was Ihr Programm foo
tun soll.
Das Problem, auf das Sie stoßen, scheint nichts mit der Ausgabeumleitung zu tun zu haben. Sie können testweise den folgenden Befehl ausprobieren:
cat > someFile.txt
Geben Sie irgendetwas ein. Die Weiterleitung erfolgt zu dem, was Sie eingegeben haben someFile.txt
(endet mit ctrl+ d).
Übrigens wird die Ausgabedatei von Ihrer Shell erstellt, nicht von Ihrem Programm foo
. Selbst wenn Sie einen nicht vorhandenen Befehl eingeben, wird die Ausgabedatei trotzdem erstellt (leer):
/bin/nonexistent > zzz
Antwort2
Eine andere Möglichkeit besteht darin, dass es foo
verwendet wird isatty
und nichts in stdout schreibt, wenn stdout nicht auf einen interaktiven Ort verweist.
ZUSAMMENFASSUNG
#include <unistd.h> int isatty(int fd);
BESCHREIBUNG Die Funktion isatty() testet, ob fd ein offener Dateideskriptor ist, der auf ein Terminal verweist.
Dieses kurze Python-Programm demonstriert es:
import sys, os
if sys.stdout.isatty():
print "Hello, tty %s" % os.ttyname(1)
else:
print "stdout: not a typewriter: how boring"
Das Gleiche gilt für dieses kurze C-Programm:
#include <stdio.h>
#include <unistd.h>
int main (void) {
if ( isatty(stdout) ) {
printf("Hello, tty %s\n", ttyname(1));
} else {
printf("stdout: not a typewriter: how boring\n");
}
return 0;
}
Beide Programme haben das identische Verhalten:
$ ./isatty > notatty ; cat notatty
stdout: not a typewriter: how boring
$ ./isatty.py
Hello, tty /dev/pts/1
$ ./isatty | cat
stdout: not a typewriter: how boring
Programme können basierend auf der Frage, ob sie umgeleitet werden, auswählen, wie, was und ob sie drucken.
Eine häufige Anwendung hierfür besteht darin, das Schreiben von von Terminals ( usw.) gelesenen ANSI-Escapesequenzen \e[33;1m
zur Textfärbung in Dateien zu vermeiden, was hässlich aussieht und Parser verwirrt.
Antwort3
Ich hatte das gleiche Problem. Mein Programmlog wurde nicht wie erwartet nach [stdout] geschrieben, sondern nach [stderr]. Eine Umleitung von sowohl [stdout] als auch [stderr] war daher die Lösung:
foo >> someFile.txt 2>&1