Die Umleitung der Ausgabe eines Programms in eine Datei schlägt fehl

Die Umleitung der Ausgabe eines Programms in eine Datei schlägt fehl

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.txterstellt wird. Ob diese Datei etwas enthält oder nicht, hängt davon ab, was Ihr Programm footun 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 fooverwendet wird isattyund 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;1mzur 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

verwandte Informationen